繁体   English   中英

如何在SQL查询中对行的特定排列进行分组和返回?

[英]How to group and return specific permutations of rows in an SQL query?

举个例子,这个问题会更容易。

假设表A包含两组(A,B,C)和(D,E,F)在两列上的所有排列:

**id1** | **id2**  
A   | B  
A   | C  
B   | A  
B   | C  
C   | A  
C   | B  
D   | E  
D   | F  
E   | D  
E   | F  
F   | D  
F   | E  

我想对行进行分组并在SQL中获得唯一的排列:

查询结果

id1 | id2  
A   | B  
A   | C  
D   | E  
D   | F  

要么

id1 | id2  
B   | A  
B   | C  
E   | D  
E   | F  

(第一列中该组的通用字母是必填项)

如果我们可以假设您的数据库存在公用表表达式(CTE)(Oracle,Postgresql和SQL Server都可以使用第一个选项)

假定首先返回ID1最小的集合是可接受的。 如果您想要ID1最大的那个,只需将<更改为>

如果您想要一个“中间”值,它的大小可能会有所不同...这将需要更多工作。

WITH T2 as (SELECT * FROM t WHERE ID1 < ID2)
SELECT * 
FROM t2 
WHERE ID1 not in (Select ID2 FROM t2)

如果不...

SELECT * 
FROM (SELECT * 
      FROM t 
      WHERE ID1 < ID2)
WHERE ID1 not in (SELECT ID2 
                  FROM (SELECT * 
                        FROM t 
                        WHERE ID1 < ID2)A )

虽然您可以使用不存在代替IN ...但是我很着急...

现在,如果您只拥有一个设置数据表以及一个SetNo ...

with T (ID1, SetNo) as (
SELECT 'A',1 from dual UNION ALL
SELECT 'B',1 from dual UNION ALL
SELECT 'C',1 from dual UNION ALL
SELECT 'D',2 from dual UNION ALL
SELECT 'E',2 from dual UNION ALL
SELECT 'F',2 from dual )

SELECT A.ID1, B.ID1 as ID2 
FROM (Select MIN(ID1) ID1, SetNO from t group by SetNo) A
CROSS JOIN T B
WHERE  B.ID1 <> A.ID1 and A.SetNo = B.SetNo

确保第一列始终是较低的值。 UNION删除重复项:

select id1, id2
from
(
    select id1, id2 from a where id1 <= id2
    union
    select id2, id1 from a where id1 > id2
)
where id1 in ('A', 'D')

执行为:

SQL>select id1, id2
SQL&from
SQL&(
SQL&    select id1, id2 from a where id1 <= id2
SQL&    union
SQL&    select id2, id1 from a where id1 > id2
SQL&)
SQL&where id1 in ('A', 'D');
id1 id2
=== ===
A   B
A   C
D   E
D   F

                  4 rows found

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM