原始查询:
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”标准吗?
假设 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 的相应记录,则添加仅为 null 的其他字段。
编辑:
在此处查看类似的方法。
它建议更详细但更高效
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
I found that if the field names are the same in both tables they will need to be listed individually rather than using the * operator. Also, the second SELECT statement needs to reference the other table. Simply using the same SQL as the first and changing it to a RIGHT JOIN does not allow the inclusion of the rows in the BB table.
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;
或者...您可以在您需要的字段上创建一个包含唯一记录的查询:
SELECT DISTINCT AA.C_ID
FROM AA
UNION
SELECT DISTINCT BB.C_ID
FROM BB;
通过该查询,您可以对“C_ID”上的两个表进行左连接
在 MS Access(或任何标准 SQL 语言)中可以通过这种方式实现完全/外部连接:
SELECT t1.* , t2.*
FROM (SELECT table01.* , 1 AS [_x1] FROM table01) t1
INNER JOIN
(SELECT table02.* , 1 AS [_x2] FROM table02) t2
ON t1.[_x1] = t2.[_x2];
唯一可能成为问题的是 [_x] 列中的两列。如果用户指定了他们想要的列(将 t1.* 和/或 t2.* 替换为 t1.[ColumnName11], t1.[ColumnName12],..., t2.[ColumnName21], t2 .[ColumnName22],...等...