Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何简化以下SQL查询?_Sql Server_Tsql - Fatal编程技术网

Sql server 如何简化以下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

如何简化以下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
    (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
是否正确?