Sql 显示两个表之间不同的行-MS Access

Sql 显示两个表之间不同的行-MS Access,sql,ms-access,Sql,Ms Access,我一直在努力转换以下SQL Server代码,以在MS Access中获得类似的结果 WITH TableA(Col1, Col2, Col3) AS (SELECT 'Dog',1,1 UNION ALL SELECT 'Cat',27,86 UNION ALL SELECT 'Cat',128,92), TableB(Col1, Col2, Col3) AS (SELECT 'Dog',1,1 U

我一直在努力转换以下SQL Server代码,以在MS Access中获得类似的结果

WITH TableA(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,86   UNION ALL 
         SELECT 'Cat',128,92), 
     TableB(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,105  UNION ALL 
         SELECT 'Lizard',83,NULL) 
SELECT CA.*
FROM   TableA A 
       FULL OUTER JOIN TableB B 
         ON A.Col1 = B.Col1 
            AND A.Col2 = B.Col2 
/*Unpivot the joined rows*/
CROSS APPLY (SELECT 'TableA' AS what, A.* UNION ALL
             SELECT 'TableB' AS what, B.*) AS CA     
/*Exclude identical rows*/
WHERE  EXISTS (SELECT A.* 
               EXCEPT 
               SELECT B.*) 
/*Discard NULL extended row*/
AND CA.Col1 IS NOT NULL      
ORDER BY CA.Col1, CA.Col2
给予

到目前为止,我已经能够使用以下代码转换get复制完整的外部联接,但是我无法复制取消激活联接行(交叉应用)


我需要一些帮助才能在MS Access查询中获得相同的结果。

根据我收集的信息,您有两个具有唯一行的表。您希望返回一个表中存在但另一个表中不存在的行

我建议对此进行聚合和
设置
——在任一数据库中:

SELECT col1, col2, col3
FROM ((SELECT col1, col2, col3 FROM TableA) UNION ALL
      (SELECT col1, col2, col3 FROM TableB)
     ) as ab
GROUP BY col1, col2, col3
HAVING COUNT(*) = 1;
或者,两个
不存在
子句:

SELECT a.*
FROM TableA as a
WHERE NOT EXISTS (SELECT 1
                  FROM TableB as b
                  WHERE (a.col1 = b.col1 OR a.col1 IS NULL AND b.col1 IS NULL) AND
                        (a.col2 = b.col2 OR a.col2 IS NULL AND b.col2 IS NULL) AND
                        (a.col3 = b.col3 OR a.col3 IS NULL AND b.col3 IS NULL) 
                 )
UNION ALL
SELECT b.*
FROM TableB as b
WHERE NOT EXISTS (SELECT 1
                  FROM TableA as a
                  WHERE (a.col1 = b.col1 OR a.col1 IS NULL AND b.col1 IS NULL) AND
                        (a.col2 = b.col2 OR a.col2 IS NULL AND b.col2 IS NULL) AND
                        (a.col3 = b.col3 OR a.col3 IS NULL AND b.col3 IS NULL) 
                 );

是一个使用SQL Server的DBFIDLE,但语法在MS Access中应该基本相同。

据我所知,您有两个具有唯一行的表。您希望返回一个表中存在但另一个表中不存在的行

WITH TableA(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,86   UNION ALL 
         SELECT 'Cat',128,92), 
     TableB(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,105  UNION ALL 
         SELECT 'Lizard',83,NULL) 
SELECT CA.*
FROM   TableA A 
       FULL OUTER JOIN TableB B 
         ON A.Col1 = B.Col1 
            AND A.Col2 = B.Col2 
/*Unpivot the joined rows*/
CROSS APPLY (SELECT 'TableA' AS what, A.* UNION ALL
             SELECT 'TableB' AS what, B.*) AS CA     
/*Exclude identical rows*/
WHERE  EXISTS (SELECT A.* 
               EXCEPT 
               SELECT B.*) 
/*Discard NULL extended row*/
AND CA.Col1 IS NOT NULL      
ORDER BY CA.Col1, CA.Col2
我建议对此进行聚合和
设置
——在任一数据库中:

SELECT col1, col2, col3
FROM ((SELECT col1, col2, col3 FROM TableA) UNION ALL
      (SELECT col1, col2, col3 FROM TableB)
     ) as ab
GROUP BY col1, col2, col3
HAVING COUNT(*) = 1;
或者,两个
不存在
子句:

SELECT a.*
FROM TableA as a
WHERE NOT EXISTS (SELECT 1
                  FROM TableB as b
                  WHERE (a.col1 = b.col1 OR a.col1 IS NULL AND b.col1 IS NULL) AND
                        (a.col2 = b.col2 OR a.col2 IS NULL AND b.col2 IS NULL) AND
                        (a.col3 = b.col3 OR a.col3 IS NULL AND b.col3 IS NULL) 
                 )
UNION ALL
SELECT b.*
FROM TableB as b
WHERE NOT EXISTS (SELECT 1
                  FROM TableA as a
                  WHERE (a.col1 = b.col1 OR a.col1 IS NULL AND b.col1 IS NULL) AND
                        (a.col2 = b.col2 OR a.col2 IS NULL AND b.col2 IS NULL) AND
                        (a.col3 = b.col3 OR a.col3 IS NULL AND b.col3 IS NULL) 
                 );

是使用SQL Server的DBFIDLE,但语法在MS Access中应基本相同。

请解释代码应该做什么。请解释代码应该做什么。
WITH TableA(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,86   UNION ALL 
         SELECT 'Cat',128,92), 
     TableB(Col1, Col2, Col3) 
     AS (SELECT 'Dog',1,1     UNION ALL 
         SELECT 'Cat',27,105  UNION ALL 
         SELECT 'Lizard',83,NULL) 
SELECT CA.*
FROM   TableA A 
       FULL OUTER JOIN TableB B 
         ON A.Col1 = B.Col1 
            AND A.Col2 = B.Col2 
/*Unpivot the joined rows*/
CROSS APPLY (SELECT 'TableA' AS what, A.* UNION ALL
             SELECT 'TableB' AS what, B.*) AS CA     
/*Exclude identical rows*/
WHERE  EXISTS (SELECT A.* 
               EXCEPT 
               SELECT B.*) 
/*Discard NULL extended row*/
AND CA.Col1 IS NOT NULL      
ORDER BY CA.Col1, CA.Col2