仅一次将表中的每一行与其他行进行比较

时间:2019-04-01 09:18:31

标签: sql postgresql

我有一个充满记录的postgres表,我想将其与同一表中的所有其他记录进行比较。考虑这张桌子。

create table temp (rec char(1));

填充此数据:

insert into temp (rec) values ('a');
insert into temp (rec) values ('b');
insert into temp (rec) values ('c');
insert into temp (rec) values ('d');

并使用以下SQL查询:

select a.rec, b.rec
from temp a, temp b 

这将返回16行(如预期的那样),但其中包括额外的行,其中'a'='a'和'b'='b'。要删除这些内容,我可以将查询更改为。

select a.rec, b.rec
from temp a, temp b 
where a.rec <> b.rec

这会将结果减少到12行:

"a" - "b"
"a" - "c"
"a" - "d"
"b" - "a"
"b" - "c"
"b" - "d"
"c" - "a"
"c" - "b"
"c" - "d"
"d" - "a"
"d" - "b"
"d" - "c"

但是,它仍然会拉回一些重复项,不仅会拉回其中'a'='b'的记录,还会拉回我不感兴趣的'b'='a'的记录(我已经已经将记录“ a”与记录“ b”进行了比较,因此对进行相同的比较没有兴趣)

那么,如何更改查询以一次又一次地仅将每一行与其他行进行比较?

2 个答案:

答案 0 :(得分:2)

在上一个查询中使用“ distinct”:

Jenkins

表达式select distinct least(a.rec, b.rec), greatest(a.rec, b.rec) from temp a cross join temp b where a.rec <> b.rec; least(a.rec, b.rec), greatest(a.rec, b.rec)变成b,a,然后a,b删除重复项。

在线示例:https://rextester.com/TDZQ5153

答案 1 :(得分:0)

只需将您的条件更改为<

select a.rec, b.rec
from temp a join
     temp b 
     on a.rec < b.rec;