如何在访问中编写完整的外部联接查询

use*_*488 26 sql ms-access

原始查询:

SELECT * 
FROM AA
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID);  
Run Code Online (Sandbox Code Playgroud)

如何转换上面的查询以使其在Microsoft Access中兼容?

我假设:

SELECT *
FROM AA
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID);
Run Code Online (Sandbox Code Playgroud)

在我正确地将第一个查询转换为与Access兼容的查询之前,我还没有处理过"FULL"标准?

Pau*_*per 31

假设AA和BB中没有重复的行(即所有相同的值),则完整的外连接相当于左连接和右连接的并集.

SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID
Run Code Online (Sandbox Code Playgroud)

如果存在重复行(并且您希望保留它们),请WHERE AA.C_ID IS NULL在末尾添加,或者如果没有来自AA的相应记录,则添加其他仅为空的字段.

编辑:

在这里看到类似的方法.

它建议更详细,但性能更高

SELECT *
    FROM AA
        JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE BB.C_ID IS NULL
UNION ALL
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE AA.C_ID IS NULL
Run Code Online (Sandbox Code Playgroud)

然而,这种假设AA.C_IDBB.C_ID不为空.


小智 9

更有效和更快的代码:

SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE AA.C_ID IS NULL
Run Code Online (Sandbox Code Playgroud)