如何在访问中编写完整的外部连接查询
原始查询:
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兼容的查询之前,我还没有处理“满”条件?
假设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的相应logging,则只添加一些其他字段。
编辑:
在这里看到类似的方法。
它build议更详细,但更高性能
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
不为空。
更有效率和更快的代码:
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
我发现,如果两个表中的字段名称相同,则需要单独列出,而不是使用*运算符。 另外,第二个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;