Sql server 如何从一个表中选择与其他两个表不匹配的记录
我有一个主表emp1表,包含3列和3行,如下所示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 *
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。试着使用包含的演示。