sql - 将表格中的每一行与其他每一行进行一次且仅一次的比较

标签 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' 进行了比较,因此没有兴趣以相反的方式进行相同的比较)

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

最佳答案

在最后一个查询中使用 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, bdistinct 然后删除重复项。

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

关于sql - 将表格中的每一行与其他每一行进行一次且仅一次的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55451729/

相关文章:

SQL - 非空或条件

mysql - 连接两个表后如何显示5个最大值?

spring - HikariPool-1 - 池初始化期间的异常

postgresql - 如何使用jdbc为postgresql的位列插入值

mysql - 当我尝试使用 sql INNER JOIN 查询从 3 个表获取数据时出现错误

mysql - 如何根据多条记录使用 MySQL SELECT 多列?

sql - PostgreSQL select * 其中列包含数组值

ruby-on-rails - 带有 Postgresql 和 Unicorn 的 Multi-Tenancy Rails 应用程序

java - 如何在启用 SSL 的 Spring Boot 应用程序中连接到 RDS postgres

c# - ASP.NET - 实现搜索功能和 SQL