有没有更有效的方法来执行这个嵌套的 SQL 查询?

Posted

技术标签:

【中文标题】有没有更有效的方法来执行这个嵌套的 SQL 查询?【英文标题】:Is there a more efficient way to execute this nested SQL query? 【发布时间】:2015-03-13 23:18:01 【问题描述】:

我正在编写一个查询来填充用户表单上的选择框,它工作正常,但是当我查看 SQL 时,我觉得应该有一种更好、更有效的方法来编写它。请注意,下面的两个嵌套 SELECT 来自同一个表。

我想知道是否有一个 SQL 技巧可以添加到我的曲目中,因为我必须不时进行这样的查询。或者也许我的方法在某些标准上是草率的?感谢您提供任何反馈。

这里是 SQL:

SELECT c.id, c.county_name, adr.county
FROM (SELECT id, county_name FROM counties WHERE state = (SELECT state FROM members WHERE id = 53)) AS c
    LEFT JOIN (SELECT county FROM members WHERE id = 53) AS a ON c.id = a.county;

以下是结果(部分): http://i.stack.imgur.com/Jawfa.png 右栏的“3022”是会员53所在的县。

如果需要,这里是对查询和我的意图的解释:

我有一个 members 表,其中县字段存储为一个整数,链接到名为 counties 的查找表。我还想将县结果过滤到成员所在的州。

查询正在填充 html 选择元素,我想预先选择成员所在的县。我的 php 唯一可用的信息(无需运行第二个查询来获取更多信息)是成员 ID。

所以查询需要返回县 id、县名和某种标识符,让我知道哪个记录与成员匹配(我只是使用链接县字段,我的代码会检查它)。

数据库是从 PDO ODBC 连接访问的 MDB 文件。

【问题讨论】:

【参考方案1】:

您可能不需要任何子查询,但可能需要 self-join:

SELECT counties.id, counties.county_name, members_1.county
FROM counties 
INNER JOIN members ON counties.state = members.state
LEFT JOIN members_1 ON counties.id = members_1.county
WHERE members.id = 53 AND members_1.id = 53

【讨论】:

当我将 WHERE 语句更改为:WHERE members.id = 53 AND (members_1.id = 53 OR members_1.id IS NULL) 时,我得到了很好的结果,除了只有成员表中有条目的县出现并且我希望该州的每个县都出现。非常感谢您的回答,但我没想过尝试按州链接表格。这将在未来帮助我。当可能节省的毫秒数对于此页面的使用无关紧要时,我花了这么多时间试图在这里找到一个完美的解决方案,这很愚蠢。

以上是关于有没有更有效的方法来执行这个嵌套的 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

此 SQL 查询是不是有更有效的替代方法?

没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项

编写以下 SQL 查询的更有效方法

在 Hibernate 中进行分页是不是有比执行选择和计数查询更有效的方法?

优化平均值 SQL 查询的平均值

使用多个 UNION 重写 SQL Server 查询