sql – 查找缺少的数据或比较整行

我不确定如何标题,但我一直在努力写一个查询过去2天让我感到沮丧.请参阅下面的表格结构:

----------------------
|      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的数据被导入到数据库中并用作参考,以确保手动添加到表B和表C的数据是正确的.表A与任何其他表没有关系.表B和表C在彼此之间具有一对多的关系(表B在“一”侧).

现在我正在尝试编写一个选择查询,它将列出表B中加入表C的所有项目[表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
点赞