T-SQL在WHERE EXISTS和INTERSECT之间的区别

sql*_*ser 3 t-sql sql-server

你能告诉我这两者有什么区别吗?我尝试将两者都用于比较两个表,但是结果有点不同:

  SELECT a.CustID FROM tbl1 AS a 
  WHERE EXISTS (SELECT b.CustID FROM tbl2 b WHERE (a.CustID=b.CustID))
Run Code Online (Sandbox Code Playgroud)

该查询结果为178行。但是,下面的查询将导致162行。

  SELECT a.CustID FROM tbl1 AS a
  INTERSECT
  SELECT b.CustID FROM tbl2 AS b
Run Code Online (Sandbox Code Playgroud)

PSK*_*PSK 5

如果您在tbl1中有重复的CustId,以下查询将导致多行

  SELECT a.CustID FROM tbl1 AS a 
  WHERE EXISTS (SELECT b.CustID FROM tbl2 b WHERE (a.CustID=b.CustID))
Run Code Online (Sandbox Code Playgroud)

如果您使用INTERSECT,将避免重复

  SELECT a.CustID FROM tbl1 AS a
  INTERSECT
  SELECT b.CustID FROM tbl2 AS b
Run Code Online (Sandbox Code Playgroud)

例如。

CREATE TABLE tbl1 (CustId int, CustName varchar(100))
GO
INSERT INTO tbl1 VALUES(1 ,'N1')
GO
INSERT INTO tbl1 VALUES(2 ,'N2')
GO
INSERT INTO tbl1 VALUES(1 ,'N3')
GO
CREATE TABLE tbl2 (CustId int, CustName varchar(100))
GO
INSERT INTO tbl2 VALUES (1 ,'N1')
GO
Run Code Online (Sandbox Code Playgroud)

对于上述表,如果运行

 SELECT a.CustID FROM tbl1 AS a 
  WHERE EXISTS (SELECT b.CustID FROM tbl2 b WHERE (a.CustID=b.CustID))
Run Code Online (Sandbox Code Playgroud)

您将获得2条记录。

如果你跑

   SELECT a.CustID FROM tbl1 AS a
  INTERSECT
  SELECT b.CustID FROM tbl2 AS b
Run Code Online (Sandbox Code Playgroud)

您会得到1条记录。

注意:如果对查询1 使用DISTINCT,则两者将导致相同的输出。

  SELECT DISTINCT a.CustID FROM tbl1 AS a 
  WHERE EXISTS (SELECT b.CustID FROM tbl2 b WHERE (a.CustID=b.CustID))
Run Code Online (Sandbox Code Playgroud)