1

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

2 回答 2

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 中有效。对于不支持的 iracle,请left(col, 2)改用substr(col, 1, 2)

于 2013-09-26T19:33:07.810 回答
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))
于 2013-09-26T19:33:36.057 回答