我一直在寻找SQL的解决方案。我试图从一个表中找到具有相同前两个字符和相同出生日期的记录。我想过做自我加入,但我怀疑我得到了正确的结果。这是我的疑问,请告诉我缺少什么:
select p1.frst_name,
from person p1 inner join person p2
on upper(left(p1.frst_name,2)) like upper(left(p2.frst_name,2))
and upper(p1.last_name) LIKE upper(p2.last_name)
and p1.birth_date = p2.birth_date
答案 0 :(得分:0)
将LIKE
更改为=
(您希望完全匹配),并添加连接条件以防止行加入自身:
select p1.id, p1.frst_name, p1.last_name, p1.birth_date
from person p1
join person p2
on upper(left(p1.frst_name,2)) = upper(left(p2.frst_name,2))
and upper(p1.last_name) = upper(p2.last_name)
and p1.birth_date = p2.birth_date
and p1.id != p2.id
如果不添加and p1.id != p2.id
,则会返回每一行,因为当然每行都会匹配自己。
问题是用mysql和oracle标记的。以上查询适用于mysql。对于不支持left(col, 2)
的iracle,请改用substr(col, 1, 2)
。
答案 1 :(得分:0)
加入last_name和birth_date,因为你希望它们完全匹配,然后按匹配的前两个字符进行过滤。
您不应该在p1.frst_name或p2.frst_name上使用upper()。因为它们是同一个表中的相同列,所以它们的大小写匹配。
...试
select p1.frst_name,
from person p1
full outer join person p2
on p1.last_name = p2.last_name
and p1.birth_date = p2.birth_date
where upper(left(p1.frst_name,2)) like upper(left(p2.frst_name,2))