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

时间:2017-11-18 23:54:33

标签: 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

假设,如果我必须选择仅在第一个表中可用而不在第二个表中的记录,那么我可以使用以下查询

select * FROM emp1 b 
  LEFT JOIN emp2 f ON f.empid = b.empid 
      WHERE f.id IS NULL

但在这里我有第三个表emp3,有3列和1行

empid empname empsal
2     b       300

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

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,这里有一个使用NOT IN

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 |
+-------+---------+--------+

<强> Demo