MySQL:JOIN中的COALESCE

时间:2015-01-12 22:53:47

标签: mysql join left-join match coalesce

我一直在尝试使用COALESCE创建一个具有多种匹配形式的查询,以便加入两个表格 - 但据我所知,它还没有工作。

有人可以告诉我这个查询有什么问题吗?

SELECT *
FROM t1
LEFT JOIN t2 ON COALESCE(t1.id,t1.phone,t1.address) = COALESCE(t2.id,t2.phone,t2.address)

这样的事情。希望查询会查看t1t2中的唯一ID是否先匹配,如果他们没有匹配,它会继续查看手机是否匹配,尝试匹配多组条件并返回与任何列匹配的条件,并且如果查询无法找到匹配项,则仅从t1返回NULL将非常有用一点都不。


编辑:

不工作,"我的意思是,似乎ID匹配工作 - 如果唯一标识符匹配,它将从t2(而不是NULL)返回数据,但它不会继续尝试在手机上匹配号码或地址线;这很可能是因为t1表没有返回任何NULL值。

该表的定义是t1是可能存在于较大t2表中的较小数据子集。让我们说t1是一个约100人的表,只有几个标准:名称,电话,地址,身份证(虽然ID并不存在于每一行) - 而{{{} 1}}是一个大约30,000的大表,有更多的标准(姓名,电话,地址,身份证,工作,志愿者,电子邮件,笔记等),我试图在30k内找到100。 / p>

1 个答案:

答案 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.idt2.address