需要查询以列出两列相对相同的行,但需要注意 Postgresql

Posted

技术标签:

【中文标题】需要查询以列出两列相对相同的行,但需要注意 Postgresql【英文标题】:Need query to list rows where two columns are relatively the same with caveat in Postgresql 【发布时间】:2019-01-25 03:24:34 【问题描述】:

大多数情况下比较两个或多个列的相同值在两个表之间。我需要比较表中的两列,其中相对于另一列使用了 3 个所有者值。这将是 3 个不同的名字。

我见过表比较,但这是在一个表中,数据已经被列值分隔。该表是数千行。所有者列只有三个不同的名称。

因此,Joe、Sam 和 Jim 有一排名字。当这两个人中的任何一个在行中列出了共同的名字和姓氏时,他们将与其他列数据(如位置和 zip)一起列为输出。所以如果 Joe 和 Sam 有两个共同的名字,输出会列出:

Owner,firstname,lastname,location,zip

Joe,Bob,Smith,Dallas,37377

Sam,Bob,Smith,Dallas,37377

Jim 没有Bob,Smith,Dallas,37377,因此它没有与 Joe 和 Sam 一起列在组中。总而言之,结果将是这 3 个所有者的几百行分组,其中找到了一个通用名称。如果有人使用 Bobby 或 Smiths,我将需要在查询中使用百分比。因此,像 Smithson 这样的名字会出现,但我会调整。

我把这些都打出来了,页面将其视为代码,所以我很抱歉我不得不缩写。

【问题讨论】:

【参考方案1】:

最直接的使用方法是自连接,尽管 EXISTS 可能更快。

一、自加入:

--note DISTINCT here because if Joe, Bob, and Sam all have records with the name we don't want duplicates
select DISTINCT f.owner, f.firstname, f.lastname, f.location, f.zip
from tablename f
join tablename s on f.firstname = s.firstname and f.lastname = s.lastname and f.owner <> s.owner

然后,使用 EXISTS:

select f.owner, f.firstname, f.lastname, f.location, f.zip
from tablename f
WHERE EXISTS(select 1 from tablename s WHERE s.firstname = f.firstname and s.lastname = f.lastname and s.owner <> f.owner)

当然,如果您希望 'Smith' 和 'smithson' 匹配而不是相等,则可以将相等比较替换为:(f.firstname ilike (s.firstname||'%') OR s.firstname ilike (f.firstname||'%')) 您可以使用它(或任何其他比较)

【讨论】:

以上是关于需要查询以列出两列相对相同的行,但需要注意 Postgresql的主要内容,如果未能解决你的问题,请参考以下文章

sql查询以选择两列中具有相同id但不同值的记录

EXCEL如何将两列中相同的行筛选出来并排序

mysql查询优化

两列,相同的数据,不同的 Where 子句

列出包含部分相同数据的行。部分并不总是相同

SQL - 选择两列中具有相同值的行