我尝试使用SQL比较MS Access中的两个表。每个表有两列。 TableA的行数少于TableB,TableA中的所有内容也应该在TableB中。我想通过显示不匹配的行来检查TableA中的行是否与TableB中的相应行相同。
这是我遇到问题的地方。我知道如何比较行,但不知道如何比较列。所以现在如果TableA的column1中的行与TableB中的column1的行匹配,即使TableA的column2中的某些行与TableB中的某些row2行不匹配,我的查询也会显示为空,反之亦然。 / p>
这是我当前的(通用)SQL代码:
SELECT TableA.*
FROM TableA LEFT JOIN TableB ON TableA.column1 = TableB.column1
WHERE TableA.column1 Is Null;
有没有人知道如何修改此代码以正确检查两列?我希望将列视为一个连接实体而不是单独的实体。
谢谢!
编辑:我想出了怎么做。一些答案让我走上了正确的道路,但没有一个是完整的。这就是我最终做的事情。也许它会帮助别人。
SELECT TableA.*
FROM TableA LEFT JOIN TableB ON TableA.column1 = TableB.column1
AND TableA.column2 = TableB.column2
WHERE TableA.column1 Is Null OR TableA.column2 Is Null;
答案 0 :(得分:1)
我想你需要这样的东西:
SELECT 'Row only in tableA', TableA.column1, TableA.column2
FROM TableA
LEFT JOIN
TableB ON TableA.column1 = TableB.column1 and TableA.column2 = TableB.column2
WHERE TableA.column1 <> TableB.column1 or TableA.column2 <> TableB.column2
union all
SELECT 'Row only in tableB', TableB.column1, TableB.column2
FROM TableB
LEFT JOIN
TableA ON TableA.column1 = TableB.column1 and TableA.column2 = TableB.column2
WHERE TableA.column1 <> TableB.column1 or TableA.column2 <> TableB.column2;
答案 1 :(得分:0)
有点不清楚,但听起来像你想要的东西:
SELECT TableA.*
FROM TableA LEFT JOIN TableB ON TableA.column1 = TableB.column1
WHERE
Tableb.column1 Is Null // not found in Tableb
OR Tablea.Column2 <> Tableb.Column2 // column2 does not match
答案 2 :(得分:0)
我认为这对你有用。我在防御方面编写了这个代码,因为我不知道你正在使用哪种数据类型。我们尝试做的是从表中的所有列创建一个键,并加入其中。要找出两个表中完全相同的内容:
SELECT TableA.*
FROM TableA INNER JOIN TableB ON CStr(Nz(TableA.column1, "")) & "_" & CStr(Nz(TableA.column2, "")) = CStr(Nz(TableB.column1, "")) & "_" & CStr(Nz(TableB.column2, ""));
找出TableA中缺少的内容:
SELECT TableB.*
FROM TableA RIGHT JOIN TableB ON CStr(Nz(TableA.column1, "")) & "_" & CStr(Nz(TableA.column2, "")) = CStr(Nz(TableB.column1, "")) & "_" & CStr(Nz(TableB.column2, ""))
WHERE TableA.column1 IS NULL;
我们的想法是,我们从所有列创建一个键,这样我们就可以像只有一列的外连接一样工作。
编辑:哎呀,翻了我的Nz和CStr电话。
答案 3 :(得分:0)
SELECT TableA.*
FROM TableA
LEFT JOIN TableB
ON TableA.column1 = TableB.column1
AND TableA.column2 = TableB.column2
WHERE TableA.column1 Is Null;