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

原始查询:

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_IDBB.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;