对使用连接或子查询 SQL 感到困惑?

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)

Eri*_*ing 6

但哪个更准确/与更多记录相关?

两者都不是。优化器可以自由地将子查询重写为连接。

为清楚起见,由于您不需要来自 的任何列Table2,我将采用第三个选项并使用EXISTS.

在这种情况下,这只是对读者的好处。在其他情况下,编写连接可能会导致不必要的行重复,这通常会导致有人添加DISTINCTGROUP BY删除它们,而这对于EXISTSIN...

当然,它与NOT IN. 如果NULLs 存在于关系中,您将得到一个空的结果集。这可能会让开始查询的编写者感到困惑。

作为一种风格的选择,我去EXISTSNOT EXISTS当我引用一个子查询,和IN/NOT IN当我有文字值的列表。

希望这可以帮助!