原始查询:
SELECT *
FROM AA
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID);
如何转换上述查询以使其在Microsoft Access中兼容?
我假设:
SELECT *
FROM AA
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID);
在我将第一个查询正确转换为与Access兼容的查询之前,我还没有处理过“FULL”标准?
答案 0 :(得分: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
如果存在重复的行(并且您希望保留它们),请在末尾添加WHERE AA.C_ID IS NULL
,或者如果AA中没有相应的记录,则仅添加其他字段。
编辑:
查看类似的方法here。
它建议更详细,但性能更高
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
但是,这假设AA.C_ID
和BB.C_ID
不为空。
答案 1 :(得分:8)
更有效和更快的代码:
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
答案 2 :(得分:1)
我发现如果两个表中的字段名称相同,则需要单独列出而不是使用*运算符。此外,第二个SELECT语句需要引用另一个表。只需使用与第一个相同的SQL并将其更改为RIGHT JOIN就不允许在BB表中包含行。
SELECT AA.C_ID
FROM AA
LEFT JOIN BB ON
AA.C_ID = BB.C_ID
UNION ALL
SELECT BB.C_ID
FROM BB
LEFT JOIN AA ON
AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL;
答案 3 :(得分:0)
或者...您可以在您需要的字段上创建一个具有唯一记录的查询:
SELECT DISTINCT AA.C_ID
FROM AA
UNION
SELECT DISTINCT BB.C_ID
FROM BB;
使用该查询,您可以对“C_ID”上的两个表进行左连接