从表中选择名称具有相同的首字母

时间:2013-09-26 19:16:32

标签: mysql sql oracle oracle-sqldeveloper

我一直在寻找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

2 个答案:

答案 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))