Neo*_*Neo 1 sql-server sql-server-2012
表格1
Id Name DemoID
1 a 33
2 b 44
3 c 33
4 d 33
5 e 44
Run Code Online (Sandbox Code Playgroud)
表2
Id DemoID IsTrue
11 33 1
12 44 1
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用以下 2 个使用连接和使用子查询的查询来找到表 2 中存在哪个 DemoID,但是对于更多的记录,哪个更准确/更相关?
使用加入 -
SELECT Table1.Id FROM Table1 Table1 join Table2 Table2 on Table1.DemoID = Table2.DemoID
WHERE Table2.IsTrue = 1
Run Code Online (Sandbox Code Playgroud)
使用子查询 -
SELECT Table1.Id FROM Table1 Table1
WHERE Table1.DemoID in (select Table2.DemoID from Table2 Table2)
Run Code Online (Sandbox Code Playgroud)
但哪个更准确/与更多记录相关?
两者都不是。优化器可以自由地将子查询重写为连接。
为清楚起见,由于您不需要来自 的任何列Table2
,我将采用第三个选项并使用EXISTS
.
在这种情况下,这只是对读者的好处。在其他情况下,编写连接可能会导致不必要的行重复,这通常会导致有人添加DISTINCT
或GROUP BY
删除它们,而这对于EXISTS
或IN...
当然,它与NOT IN
. 如果NULL
s 存在于关系中,您将得到一个空的结果集。这可能会让开始查询的编写者感到困惑。
作为一种风格的选择,我去EXISTS
或NOT EXISTS
当我引用一个子查询,和IN
/NOT IN
当我有文字值的列表。
希望这可以帮助!
归档时间: |
|
查看次数: |
71 次 |
最近记录: |