从名称具有相同首字母的表中选择
Posted
技术标签:
【中文标题】从名称具有相同首字母的表中选择【英文标题】:Select from table where names have same initial letters 【发布时间】:2013-09-26 19:16:31 【问题描述】:我一直在寻找 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
【问题讨论】:
这是oracle还是mysql? 【参考方案1】:加入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))
【讨论】:
你的第二段不一定是真的。 啊,这是否仅仅是因为可能(并且根据 OP,应该是)具有相同姓氏和生日的不同记录?还是我还缺少其他东西?【参考方案2】:将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)
。
【讨论】:
我不确定oracle和left(),所以我试了一下。我现在不同意你的最后一句话。 @DanBracuk 好的,我在底部添加了一条注释,说明 Oracle 缺乏对非常基本的 amd sql 标准功能的支持。感谢您引起我的注意。以上是关于从名称具有相同首字母的表中选择的主要内容,如果未能解决你的问题,请参考以下文章
sencha touch :: 如果首字母小写或大写,如何让商店分拣机忽略