Sql server 如何从一个表中选择与其他两个表不匹配的记录

Sql server 如何从一个表中选择与其他两个表不匹配的记录,sql-server,sql-server-2012,msbi,Sql Server,Sql Server 2012,Msbi,我有一个主表emp1表,包含3列和3行,如下所示 empid empname empsal 1 a 100 2 b 300 3 c 500 第二个表emp2有3列1行 empid empname empsal 1 a 100 empid empname empsal 2 b 300 假设,如果我必须选择只在第一个表中可用但在第二个表中不可用的记录,那么我可以使用下面的查询 select *

我有一个主表emp1表,包含3列和3行,如下所示

empid empname empsal
1     a       100
2     b       300
3     c       500
第二个表emp2有3列1行

empid empname empsal
1     a       100
empid empname empsal
2     b       300
假设,如果我必须选择只在第一个表中可用但在第二个表中不可用的记录,那么我可以使用下面的查询

select * FROM emp1 b 
  LEFT JOIN emp2 f ON f.empid = b.empid 
      WHERE f.id IS NULL
但这里有第三个表emp3,有3列和1行

empid empname empsal
1     a       100
empid empname empsal
2     b       300

如果我必须选择仅在第一个表中可用的记录,而在第二个和第三个表中不可用的记录,那么最好的解决方案是什么?

有很多方法,下面是一种使用
不在
中的方法:

CREATE TABLE Emp1 (
    empid INT, 
    empname VARCHAR(25),
    empsal INT
    );

CREATE TABLE Emp2 (
    empid INT, 
    empname VARCHAR(25),
    empsal INT
    );

CREATE TABLE Emp3 (
    empid INT, 
    empname VARCHAR(25),
    empsal INT
    );

INSERT INTO Emp1 VALUES
(1,     'a',       100),
(2,     'b',       300),
(3,     'c',       500);

INSERT INTO Emp2 VALUES
(1,     'a',       100);

INSERT INTO Emp3 VALUES
(2,     'b',       300);

SELECT *
FROM Emp1
WHERE empid NOT IN ( SELECT empid FROM Emp2 UNION SELECT empid FROM Emp3);
结果:

+-------+---------+--------+
| empid | empname | empsal |
+-------+---------+--------+
|     3 | c       |    500 |
+-------+---------+--------+

提示:
不存在
我可以查询请另一个左连接到emp3并在where子句中添加一个条件“and emp3.id is NULL”@RafaelNadal是的,您可以拥有它,如果有效,您也可以将其标记为已接受并解决您的问题。类似的问题被问了无数次。@RafaelNadal很乐意帮助:)事实上,我在第一个表中有超过3000万条记录,我需要在第一个表中检查其他25个表,在这种情况下,基于性能的最佳解决方案是什么,谢谢@RafaelNadal我想我以前看到过这个问题,你得到了解决方案,Mitch Wheat提到的假设是,如果我在其他两个表中没有相同的列数(emp2只有4列,emp3有5列),那么解决方案是什么??任何人都请帮忙@拉斐尔纳达尔:我在回答中使用了其他专栏吗?不,你不需要它们,即使Emp2表有5列,Emp3有10列,重要的是ID。试着使用包含的演示。