验证两个不同表的两列完全匹配

Posted

技术标签:

【中文标题】验证两个不同表的两列完全匹配【英文标题】:Verify two columns of two different tables match exactly 【发布时间】:2011-02-05 20:42:35 【问题描述】:

在更深层次的视图中编写视图和嵌套视图时,我有时会遗漏某些内容并最终丢失行/数据。如何检查两个不同表中的列是否具有完全匹配的数据?

例子:

select count(distinct table1.col1)
  from table1
 where table1.col1 not in (select distinct table2.col1 
                             from table2);

这将返回 table1.col1 中不在 table2 中的值的数量。但是,我不知道这是一个好的解决方案,因为它不计算 table1.col1 中不存在的 table2.col1 值。

【问题讨论】:

当然嵌套视图通常是一件坏事(至少在 SQL Server 中)。在开发中看起来不错,但是一旦你进入 prod 并且有很多记录,你可以通过嵌套视图来关闭系统。我会通过向基表添加几百万条测试记录来测试这些嵌套视图。 确实,我最终会重写查询,创建一串嵌套视图是为了在开始时进行概念验证,以验证数据是否按照我想要的方式形成。当数据库推出时,我会重构视图。 【参考方案1】:
declare @count int, @count2 int


select @count = count(distinct table1.col1)
  from table1
 where table1.col1 not in (select distinct table2.col1 
                             from table2)

select @count2 = count(distinct table2.col1)
  from table2
 where table2.col1 not in (select distinct table1.col1 
                             from table1)

select @count + @count2

【讨论】:

使用 SQLite,我可以使用 MS SQL 或 mysql 等内部变量吗? 我不认为它被重新标记,但它被标记为 SQL :)【参考方案2】:

用途:

SELECT MAX(x.t1_missing_count) AS t1_missing_count, 
       MAX(x.t2_missing_count) AS t2_missing_count
  FROM (
SELECT COUNT(DISTINCT t1.col1) AS t1_missing_count,
       NULL AS t2_missing_count
  FROM TABLE_1 t1
 WHERE t1.col1 NOT IN (SELECT DISTINCT t2.col1 
                         FROM TABLE_2 t2)
UNION ALL
SELECT NULL,
       COUNT(DISTINCT t2.col1),           
  FROM TABLE_2 t2
 WHERE t2.col1 NOT IN (SELECT DISTINCT t1.col1 
                         FROM TABLE_1 t1)) x

【讨论】:

不知道为什么我不考虑使用 UNION。所以我使用 NOT IN 子句查询对于这样的操作是否可行? @galford13x:我不知道这三个中的哪一个 - NOT EXISTS、NOT IN 和 LEFT JOIN/IS NULL - 目前使用效率最高。【参考方案3】:
select count(*) from (

select
table1.col1 from table1 left join table2 on table1.col1 = table2.col2
where table2.col1 is null

union

select table2.col1 from table2 left join table 1 on table2.col1 = table1.col1
where table1.col1 is null

)

【讨论】:

【参考方案4】:

您可以使用两个EXCEPT 查询(或合并它们)来检查:

SELECT DISTINCT col1
FROM table1
EXCEPT
SELECT DISTINCT col1
FROM table2

这将显示 table1 中存在的值,但 table2 中不存在。然后再次运行,表名相反。

【讨论】:

我喜欢简洁。我用 SELECT count() 包装它以获得差异的数量。谢谢。

以上是关于验证两个不同表的两列完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 中的验证器检查两个表中两列的唯一性

比较两个excel的两列并返回第三列

连接来自两个不同表的两列

显示来自两个不同表的两列之间的差异(比较表)

想比较laravel中不同表的两列

根据两个不同表上的两列对完全连接进行排序