Sql server 如何简化以下SQL查询?
如何简化以下SQL查询Sql server 如何简化以下SQL查询?,sql-server,tsql,Sql Server,Tsql,如何简化以下SQL查询 DECLARE @EMPLOYEE1 TABLE (EMPID INT,DEPT1 INT,DEPT2 INT) DECLARE @EMPLOYEE2 TABLE (EMPID INT,DEPT1 INT,DEPT2 INT) INSERT INTO @EMPLOYEE1 VALUES (1,1,1), (2,2,2), (3,10,3), (4,4,4) INSERT INTO @EMPLOYEE2 VALUES
DECLARE @EMPLOYEE1 TABLE (EMPID INT,DEPT1 INT,DEPT2 INT)
DECLARE @EMPLOYEE2 TABLE (EMPID INT,DEPT1 INT,DEPT2 INT)
INSERT INTO @EMPLOYEE1 VALUES
(1,1,1),
(2,2,2),
(3,10,3),
(4,4,4)
INSERT INTO @EMPLOYEE2 VALUES
(1,1,1),
(2,2,2),
(3,10,10),
(4,10,4)
SELECT A.EMPID,
A.DEPT1 EMP1_DEPT,
0 TYPES
FROM @EMPLOYEE1 A
LEFT JOIN @EMPLOYEE2 B ON A.DEPT1=B.DEPT1
WHERE B.DEPT1 IS NULL
UNION ALL
SELECT A.EMPID,
A.DEPT2 EMP2_DEPT,
1 TYPES
FROM @EMPLOYEE1 A
LEFT JOIN @EMPLOYEE2 B ON A.DEPT2=B.DEPT2
WHERE B.DEPT2 IS NULL
任何人都能解决这个问题吗,提前谢谢你这里有一个方法:
SELECT DISTINCT
A.EMPID,
CASE WHEN B.DEPT1 IS NULL THEN A.DEPT1 ELSE A.DEPT2 END As EMP1_DEPT,
CASE WHEN B.DEPT1 IS NULL THEN 0 ELSE 1 END As TYPES
FROM @EMPLOYEE1 A
LEFT JOIN @EMPLOYEE2 B ON A.DEPT1=B.DEPT1
LEFT JOIN @EMPLOYEE2 C ON A.DEPT2=C.DEPT2
WHERE B.DEPT1 IS NULL
OR C.DEPT2 IS NULL
下面是另一种使用
交叉应用
和值
的替代方法:
SELECT A.EMPID,
A_D.DEPT AS 'EMP1_DEPT',
A_D.[TYPES]
FROM @EMPLOYEE1 A
CROSS APPLY (VALUES (A.DEPT1, 0), (A.DEPT2, 1)) A_D ( DEPT, [TYPES] )
WHERE NOT EXISTS (SELECT 1
FROM @EMPLOYEE2 B
CROSS APPLY (VALUES (B.DEPT1, 0), (B.DEPT2, 1)) B_D ( DEPT, [TYPES] )
WHERE B_D.DEPT = A_D.DEPT
AND B_D.[TYPES] = A_D.[TYPES]);
这种方法的优点是每个表只命中一次。它使用notexists
通过使用左反半联接来提高查询计划中的性能
您希望输出是什么样子?您当前的查询没有尝试在任何
JOIN
/WHERE
条件下使用EMPID
是否正确?