我有一个充满记录的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”进行了比较,因此对进行相同的比较没有兴趣)
那么,如何更改查询以一次又一次地仅将每一行与其他行进行比较?
答案 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
删除重复项。
答案 1 :(得分:0)
只需将您的条件更改为<
:
select a.rec, b.rec
from temp a join
temp b
on a.rec < b.rec;