我不知道如何表达标题,但过去两天我一直在尝试编写一个查询,这让我感到沮丧。请参阅下面我的表结构:
----------------------
| TABLE A |
----------------------
| FIELD 1 | FIELD 2 |
----------------------
| X | A |
| X | B |
| Y | C |
| Y | D |
| Y | E |
| Z | F |
---------------------
----------------------
| TABLE B |
----------------------
| PK FIELD | FIELD 2 |
----------------------
| 1 | X |
| 2 | Y |
| 3 | Z |
----------------------
1
|
|
|
*
------------------------
| TABLE C |
------------------------
| FK FIELD | FIELD 1 |
------------------------
| 1 | A |
| 1 | B |
| 2 | C |
| 2 | D |
| 3 | E |
------------------------
好的,基本上,A表的数据被导入到DB中,并作为引用,以确保手动添加到B表和C表中的数据是正确的。表 A 与任何其他表没有关系。表 B 和表 C 彼此之间具有一对多关系(表 B 位于“一”侧)。
现在我正在尝试编写一个选择查询,它将列出连接到表 C 的表 B 中的所有项目,其中 [表 B].[字段 2] = [表 A].[字段 1] 但其中 [表 C].[字段 1] 与 [表 A].[字段 2] 不同。
我期望的结果(与上面的数据一样)是:
- Y,因为它未链接到 E
- Z,因为它链接到 E 而不是 F
这是我尝试过的(除其他外):
SELECT [Table B].[Field 2], [Table C].[Field 1], [Table A].[Field 2] AS CorrectItem
FROM [Table B] INNER JOIN
[Table C] ON [Table B].[Field 2] = [Table C].[Field 1] INNER JOIN
[Table A] ON [Table B].[PK Field] = [Table A].[FK Field] AND
[Table C].[Field 1] <> [Table A].[Field 2]
ORDER BY [Table B].[Field 2]
但这显然是错误的,因为它为我提供了数据可能错误的所有可能组合。
我很茫然,我确信这很简单,但我不知道我错在哪里。
谢谢
最佳答案
因此,TableA
是您应该拥有的,TableC *--1 TableB
是您确实拥有的。
您所拥有的内容可以转换为与 TableA 相同的格式,如下所示:
SELECT TableB.Field2 As Field1, TableB.Field1 As Field2
FROM TableB
JOIN TableC on TableB.FkField = TableC.PkField
现在您可以使用它从 TableA(您应该拥有的行)中减去这些行(您拥有的行)。剩下的都是您应该拥有但没有的行:
SELECT Field1, Field2
FROM TableA
EXCEPT
SELECT TableB.Field2 As Field1, TableB.Field1 As Field2
FROM TableB
JOIN TableC on TableB.FkField = TableC.PkField
关于sql - 查找缺失数据或比较整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18910752/