检查两列之间的一对一关系

时间:2019-06-12 22:39:43

标签: sql sql-server

我有两列我怀疑有多余的信息-想象一下缩写和全名,其中缩写和全名可能是一对一的关系。我想弄清楚是否存在一对一的关系,并找出不签出的任何地方。

如果有帮助,我正在使用SQL Server。

我看过here。 但是,这并不是我所需要的,因为如果我有同一对的两个副本,它将进行标记。

我想做的事情与this question in Python更相似。看起来该功能在SQL中全部可用,但是由于还有其他上下文列,我希望能够查看关系不成立的地方(它们可能只是数据错误)。

例如该表很好:

col1 | col2 | context
1 | a | cont1
2 | b | cont2
3 | c | cont3
1 | a | cont4
3 | c | cont5

因为col1中的每1个都与'a'匹配,并且没有其他任何内容,每2个与'b'等匹配,等等。而每个'a'仅与'1'等匹配,等等。

此表不好:

col1 | col2 | context
1 | a | cont1
2 | b | cont2
3 | c | cont3
1 | b | cont4
3 | c | cont5

因为1与“ a”和“ b”都匹配。在这种情况下,我想以某种方式表明第一行,第二行和第四行有问题,应该接受人工检查。

目前,我假设没有NULL(我打算分别处理它们)

1 个答案:

答案 0 :(得分:2)

您可以使用聚合来获取不良行。如果我理解正确:

select col1
from t
group by col1
having max(col2) <> min(col2);

如果要原始行,请使用exists

select t.*
from t
where exists (select 1 from t t2 where t2.col1 = t.col1 and t2.col2 <> t.col2);