在SQL中查找多个列的不匹配值

在SQL中查找多个列的不匹配值,sql,Sql,我有两张桌子 表1 表2 我想检查这些表中col1、col2和col3的值是否完全相同。还有一些像Cal4这样的栏目,我不想考虑。两个表中都没有主键。还有一些值在col1,col2和col3中重复。例如,在表1中,v1、v2、v3对col1、col2、col3重复两次。因此,在表2中也应该重复相同的次数 在上面,只有v13、v14、v15匹配。 v1、v2、v3在表2中出现两次,但在表1中出现一次。 v4、v5、v6在表1中出现两次,但在表2中出现一次。 v7、v8、v9仅出现在表1中,而不出现

我有两张桌子

表1

表2

我想检查这些表中col1、col2和col3的值是否完全相同。还有一些像Cal4这样的栏目,我不想考虑。两个表中都没有主键。还有一些值在col1,col2和col3中重复。例如,在表1中,v1、v2、v3对col1、col2、col3重复两次。因此,在表2中也应该重复相同的次数

在上面,只有v13、v14、v15匹配。 v1、v2、v3在表2中出现两次,但在表1中出现一次。 v4、v5、v6在表1中出现两次,但在表2中出现一次。 v7、v8、v9仅出现在表1中,而不出现在表2中。 v10、v11、v12仅出现在表2中,不出现在表1中。
如何在单个查询中完成此操作?

您可以使用完全联接获取异常:


如果只需要在cnt上匹配的子查询,则可以使用内部联接。

可以创建两个子查询,按列1、2、3和计数分组,然后根据列值和计数联接它们

        select * 
  from (select col1, col2, col3, count(*) c
          from table1
         group by col1, col2, col3) t1
  join (select col1, col2, col3, count(*) c
          from table2
         group by col1, col2, col3) t2 
    on t2.col1 = t1.col1
   and t2.col2 = t2.col2
   and t2.col3 = t3.col3
   and t2.c = t1.c

您可以通过此查询找到所有匹配的元组:

select col1, col2, col3
  from (select col1, col2, col3, count(*) cnt 
          from table1
         group by col1, col2, col3) t1
  join (select col1, col2, col3, count(*) cnt
          from table2
         group by col1, col2, col3) t2
 using (col1, col2, col3, cnt)
:

:

:

:


通过此

查看所有操作,您想要的输出到底是什么?你能不能请你的问题,并添加所需的输出作为一个格式化表的方式,你提出的输入数据?嗯,我无法想象确切的输出。但任何告诉两个表中哪些行不符合要求的内容。
select coalesce(t1.col1, t2.col1) as col1,
       coalesce(t1.col2, t2.col2) as col2,
       coalesce(t1.col3, t2.col3) as col3,
       t1.cnt, t2.cnt
from (select col1, col2, col3, count(*) as cnt
      from table1
      group by col1, col2, col3
     ) t1 inner join  
     (select col1, col2, col3, count(*) as cnt
      from table2
      group by col1, col2, col3
    ) t2
    on t2.col1 = t1.col1 and t2.col2 = t1.col2 and t2.col3 = t1.col3 
where (t2.cnt <> t1.cnt) or (t1.cnt is null) or (t2.cnt is null);
        select * 
  from (select col1, col2, col3, count(*) c
          from table1
         group by col1, col2, col3) t1
  join (select col1, col2, col3, count(*) c
          from table2
         group by col1, col2, col3) t2 
    on t2.col1 = t1.col1
   and t2.col2 = t2.col2
   and t2.col3 = t3.col3
   and t2.c = t1.c
select col1, col2, col3
  from (select col1, col2, col3, count(*) cnt 
          from table1
         group by col1, col2, col3) t1
  join (select col1, col2, col3, count(*) cnt
          from table2
         group by col1, col2, col3) t2
 using (col1, col2, col3, cnt)
| col1 | col2 | col3 | |------|------|------| | v13 | v14 | v15 |
select *
  from table1
 where (col1,col2,col3) not in (  
    select col1, col2, col3
      from (select col1, col2, col3, count(*) cnt 
              from table1
             group by col1, col2, col3) t1
      join (select col1, col2, col3, count(*) cnt
              from table2
             group by col1, col2, col3) t2
      using (col1, col2, col3, cnt));
| col1 | col2 | col3 | col4 | |------|------|------|------| | v1 | v2 | v3 | x | | v4 | v5 | v6 | y | | v4 | v5 | v6 | z | | v7 | v8 | v9 | w |
select *
  from table2
 where (col1,col2,col3) not in (  
    select col1, col2, col3
      from (select col1, col2, col3, count(*) cnt 
              from table1
             group by col1, col2, col3) t1
      join (select col1, col2, col3, count(*) cnt
              from table2
             group by col1, col2, col3) t2
      using (col1, col2, col3, cnt));
| col1 | col2 | col3 | col5 | |------|------|------|------| | v1 | v2 | v3 | a | | v1 | v2 | v3 | b | | v4 | v5 | v6 | c | | v10 | v11 | v12 | d |
select * from (
    select 't1' src, t1.*
      from table1 t1
    union all
    select 't2' src, t1.*
      from table1 t1) u1
 where (col1,col2,col3) not in (  
    select col1, col2, col3
      from (select col1, col2, col3, count(*) cnt 
              from table1
             group by col1, col2, col3) t1
      join (select col1, col2, col3, count(*) cnt
              from table2
             group by col1, col2, col3) t2
      using (col1, col2, col3, cnt));
| src | col1 | col2 | col3 | col4 | |-----|------|------|------|------| | t1 | v1 | v2 | v3 | x | | t1 | v4 | v5 | v6 | y | | t1 | v4 | v5 | v6 | z | | t1 | v7 | v8 | v9 | w | | t2 | v1 | v2 | v3 | x | | t2 | v4 | v5 | v6 | y | | t2 | v4 | v5 | v6 | z | | t2 | v7 | v8 | v9 | w |