4

我不知道如何用词来表达标题,但过去 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    |
------------------------

OK,所以基本上把A表的数据导入DB,作为参考,保证手动添加到B表和C表的数据是正确的。表 A 与任何其他表都没有关系。表 B 和表 C 彼此之间具有一对多的关系(表 B 位于“一”侧)。

现在我正在尝试编写一个选择查询,它将列出从表 B 连接到表 C 的所有项目,其中 [表 B].[字段 2] = [表 A].[字段 1] 但其中 [表 C] .[Field 1] 与 [Table A].[Field 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]

但这显然是错误的,因为它为我提供了数据可能错误的所有可能组合。

我很茫然,我确信这很简单,但我没有看到我要去哪里错了。

谢谢

4

1 回答 1

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
于 2013-09-20T16:35:01.657 回答