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

时间:2013-10-27 06:07:19

标签: sql ms-access

原始查询:

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”标准?

4 个答案:

答案 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_IDBB.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”上的两个表进行左连接