我一直在尝试使用COALESCE创建一个具有多种匹配形式的查询,以便加入两个表格 - 但据我所知,它还没有工作。
有人可以告诉我这个查询有什么问题吗?
SELECT *
FROM t1
LEFT JOIN t2 ON COALESCE(t1.id,t1.phone,t1.address) = COALESCE(t2.id,t2.phone,t2.address)
这样的事情。希望查询会查看t1
和t2
中的唯一ID是否先匹配,如果他们没有匹配,它会继续查看手机是否匹配,尝试匹配多组条件并返回与任何列匹配的条件,并且如果查询无法找到匹配项,则仅从t1
返回NULL将非常有用一点都不。
编辑:
不工作,"我的意思是,似乎ID匹配工作 - 如果唯一标识符匹配,它将从t2
(而不是NULL)返回数据,但它不会继续尝试在手机上匹配号码或地址线;这很可能是因为t1
表没有返回任何NULL值。
该表的定义是t1
是可能存在于较大t2
表中的较小数据子集。让我们说t1
是一个约100人的表,只有几个标准:名称,电话,地址,身份证(虽然ID并不存在于每一行) - 而{{{} 1}}是一个大约30,000的大表,有更多的标准(姓名,电话,地址,身份证,工作,志愿者,电子邮件,笔记等),我试图在30k内找到100。 / p>
答案 0 :(得分:2)
我怀疑你想要这个:
SELECT *
FROM t1 LEFT JOIN
t2
ON t1.id = t2.id OR t1.phone = t2.phone or t1.address = t2.address;
如果任何键匹配,这将匹配两行。但是,您可能需要:
SELECT *
FROM t1 LEFT JOIN
t2
ON (t1.id = t2.id) OR
((t1.id is null or t2.id is null) AND t1.phone = t2.phone) or
(((t1.id is null or t2.id is null) and (t1.phone is null or t2.phone is null)) and t1.address = t2.address
)
您的查询可能由于多种原因而失败。一种可能性是类型不兼容。另一个是不同的行具有NULL
值的不同分布,因此您最终会比较差异列,例如t1.id
到t2.address
。