【问题标题】:SQL: Compare two tablesSQL:比较两个表
【发布时间】:2013-01-08 09:27:57
【问题描述】:

您好,我有这种情况,我很震惊。

我有两个表,表 A 和表 B,它们有一个共同的主键 (panelist_id),每个 panelist_id 都有许多 entity_id。

我想检查表中是否存在每个 panelist_id 和相同的 entity_id。

注意:有很多 panelist_id,每个 panelist_id 都有很多 entity_id..

请帮帮我。

【问题讨论】:

  • 使用 sqldbx 来比较两个表,因为有视觉差异可以做到这一点。
  • 那么你有什么尝试?
  • 您使用的是什么关系型数据库?您还可以给我们表 A 和 B 的表定义吗?另外,您的数据示例以及您期望的结果也会有所帮助。
  • 我已经尝试了以下查询,但它没有给出适当的结果。 SELECT COUNT(*) AS MISMATCHED_COUNT FNDS_WRK_TOP_ENTITIES_VISIT_DAILY TEV JOIN VISITOR_IND_CHECK_DAILY TT on TEV.SOURCE_PANELIST_ID = TT.PANELIST_ID AND TEV.ENTITY_ID TT.ENTITY_ID

标签: java sql netezza


【解决方案1】:

要选择仅在其中一个表中可用的 panelist_id/entity_id 元组,您可以尝试执行以下操作:

select panelist_id, entity_id from
(
  select panelist_id, entity_id from a
  union all
  select panelist_id, entity_id from b
)
group by panelist_id, entity_id
having count(*) = 1;

【讨论】:

    【解决方案2】:
    Select A.panelist_id from tableA as A inner join tableB as B
    on A.panelist_id=B.panelist_id
    GROUP BY A.panelist_id
    HAVING COUNT(DISTINCT A.entity_id)=COUNT(DISTINCT B.entity_id)
    

    【讨论】:

      【解决方案3】:

      我不能确切地知道你在问什么,如果你只是想知道每个 Entity_ID/Panelist_ID 元组是否存在于一个或两个表中,那么这将起作用:

      SELECT  Panelist_ID, 
              Entity_ID,
              CASE WHEN COUNT(A) > 0 AND COUNT(B) > 0 THEN 'Both Tables'
                  WHEN COUNT(B) = 0 THEN 'Table A'
                  WHEN COUNT(A) = 0 THEN 'Table B'
              END AS Status
      FROM    (   SELECT  Panelist_ID, Entity_ID, 1 AS A, NULL AS B
                  FROM    A
                  UNION ALL
                  SELECT  Panelist_ID, Entity_ID, NULL AS A, 1 AS B
                  FROM    B
              ) T
      GROUP BY Panelist_ID, Entity_ID;
      

      如果您想知道每个表中的元组相同的 panelist_ID,一个表中不存在另一个表中不存在的元组,您将需要使用这个:

      SELECT  *
      FROM    A
              FULL JOIN B
                  ON A.Panelist_ID = B.Panelist_ID
                  AND A.Entity_ID = B.Entity_ID
      WHERE   A.Entity_ID IS NOT NULL
      AND     B.Entity_ID IS NOT NULL;
      

      或者如果你想知道一个表中存在的元组而不是另一个你可以使用的元组:

      SELECT  *
      FROM    A
              FULL JOIN B
                  ON A.Panelist_ID = B.Panelist_ID
                  AND A.Entity_ID = B.Entity_ID
      WHERE   A.Entity_ID IS NULL
      OR      B.Entity_ID IS NULL;
      

      编辑

      基于只需要验证临时表与永久表相同的评论,您可以使用EXISTS

      SELECT  *
      FROM    PermanentTable p
      WHERE   NOT EXISTS 
              (   SELECT  1
                  FROM    TempTable t
                  WHERE   p.Panelist_ID = t.Panelist_ID
                  AND     p.Entity_ID = t.Entity_ID
                  ... More conditions to help find if entries are missing from temp table
              )
      

      【讨论】:

      • 详细的场景是这样的。我有一个使用很多连接条件创建的临时表,还有另一个永久表,它是某个进程的输出表。现在我需要检查临时表和输出表中填充的数据是否匹配。所以我有主键作为小组成员 ID,每个小组成员 ID 有数千个实体 ID。我检查了两个表中的 panelist_ids 是否相同。现在我需要检查每个 panelist_id 是否填充了相同的 entity_id。
      猜你喜欢
      • 2018-02-25
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2017-11-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多