我不确定如何说出标题,但我一直在尝试写一个最近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]。
我期待的结果(与上面的数据一样)是:
这是我尝试过的(除其他外):
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]
但这显然是错误的,因为它给了我所有可能的组合,其中数据可能是错误的。
我很茫然,我确信这很简单,但我没看到我出错的地方。
由于
答案 0 :(得分: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