sql - 查找缺失数据或比较整行

标签 sql sql-server sql-server-2008

我不知道如何表达标题,但过去两天我一直在尝试编写一个查询,这让我感到沮丧。请参阅下面我的表结构:

----------------------
|      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/

相关文章:

sql-server - 在 Azure 数据库上执行标准 SSMS 任务

c# - CompiledQuery.Compile 需要锁(EF4、SQL Server、C#)

sql - 使用 PostgreSQL 删除行重复并获得最高值

mysql - SQL 返回包含与主键相关的外键的表列表

python - 为什么我无法在此嵌套字典中创建其他键?

sql - Oracle MERGE 语句在并行事务中执行 : How to prevent duplicate keys?

sql-server - 如何使用 Wireshark 过滤应用程序和数据库服务器之间的 SQL Server 流量?

SQL 服务器 : how to acquire exclusive lock to prevent race condition?

sql-server-2008 - 在 SQL Server 中完成 MYSQL 的 Group_Concat

SQL 更改最小值和最大值的数据格式