我不确定如何标题,但我一直在努力写一个查询过去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