在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中,而不出现在表2中。 v10、v11、v12仅出现在表2中,不出现在表1中。在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中,而不出现
如何在单个查询中完成此操作?您可以使用完全联接获取异常:
如果只需要在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 |