我有一个充满记录的 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' 进行了比较,因此没有兴趣以相反的方式进行相同的比较)
那么,我该如何更改查询以将每一行与其他每一行进行一次且仅一次比较?
最佳答案
在最后一个查询中使用 distinct:
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
和 distinct
然后删除重复项。
关于sql - 将表格中的每一行与其他每一行进行一次且仅一次的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55451729/