大多数情况下,在两个表之间比较两个或更多列的相同值。我需要比较表中的两列,其中相对于另一列使用了3个所有者值。这将是3个不同的名字。
我见过表比较,但这是在一个表中,并且数据已经由一个列值分隔。该表有数千行。Owner列只有三个不同的名称。
所以Joe,Sam和Jim有一排排的名字。当这两个人中的任何一个在行中列出了共同的名字和姓氏时,他们将与位置和邮政编码等其他列数据一起作为输出列出。因此,如果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这样的名字将会出现,但我会调整。
我把这些都打出来了,页面认为它是代码,所以我道歉,我不得不缩写。
发布于 2019-01-25 13:44:05
可以使用的最直接的方法是自连接,尽管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||'%'))
你可以使用(f.firstname ilike (s.firstname||'%') OR s.firstname ilike (f.firstname||'%'))
(或任何其他比较)
https://stackoverflow.com/questions/54358547
复制相似问题