需要查询以列出两列相对相同的行,但需要注意 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的主要内容,如果未能解决你的问题,请参考以下文章