选择行与所有列匹配或最多一个无与伦比

问题描述:

表A有21列,第一列是ID,第二列 - 21列是D1-D20,100K行选择行与所有列匹配或最多一个无与伦比

表B具有相同结构如表A,但它具有50,000列

找到从表A和表B中的所有数据:

  1. 所有列匹配或
  2. 至多一个未知列是无与伦比
+0

我标记了sql server,我不知道为什么会丢失,我该如何编辑它? – Philip

+0

当你说所有列你的意思是D1 - D20 ..对不对?我们总是通过id匹配,然后我们需要找出是否所有的d1-d20匹配。如果不是,我们最多只能有一个不匹配的d1到d20 ..这是正确的吗? – user6542823

+0

是啊,这就是我问的,我真的不知道如何满足条件“最多一列是无与伦比的” – Philip

您可以使用CASE语句。以下应该适合你。试着让我知道。

表t1和t2。为了简单起见,我只保留了3列。

Select t12.myID 
from 
(Select t1.ID as myID, t2.*, Case when 
t1.d1 = t2.d1 and t1.d2 = t2.d2 and t1.d3 = t2.d3 
then 'A' 
else 
    Case when 
    Length(Replace(Concat(Case When t1.d1 = t2.d1 then '0' else '1' end 
         ,Case When t1.d2 = t2.d2 then '0' else '1' end 
         ,Case When t1.d3 = t2.d3 then '0' else '1' end),'0','')) = '1' 
     then 'B' 
    else 
     'C' 
    end 
end as mc 
    from t1, t2 
    Where t1.ID = t2.ID) t12 
    Where t12.mc IN ('A', 'B'); 
+0

我明白了,案例有助于过滤,但如何从t1获得满足此条件的id 。顺便说一下,我可以使用sum(case ...)= 1作为第二个条件吗? – Philip

+0

只需在select中添加t1.ID即可。我已经更新了我的答案。 – user6542823

+0

立即检查,您只会获得'所有列匹配'或'最多只有一列匹配'的ID。 – user6542823