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

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 :: 如果首字母小写或大写,如何让商店分拣机忽略

Java 基础标识符

通过impala中的常用字母对记录进行有效分类

具有不同字体大小(首字母,首字母)的 react-native 嵌套文本

根据拼音首字母进行过滤的combobox