通过示例,这个问题更容易。
假设表A包含两个组(A,B,C)和(D,E,F)的两列的所有排列:
android:src="@android:drawable/ic_menu_camera"
我想对行进行分组并在SQL中获得唯一的排列:
查询结果
**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
或
id1 | id2
A | B
A | C
D | E
D | F
(第一栏中该组的通用字母是必需的)
答案 0 :(得分:2)
如果我们可以假设您的数据库存在公用表表达式(CTE)(Oracle,Postgresql和SQL Server都可以使用第一个选项)
这假设首先返回具有最小ID1的集合是可接受的。如果您想要ID1最大的那个,只需将<
更改为>
。
如果你想要一个&#34;中&#34;价值可能各不相同......这需要更多的工作。
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
答案 1 :(得分:1)
确保第一列始终为较低值。 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