将行对与交换列组合在一起

时间:2014-07-07 07:41:56

标签: sql oracle

我有一个包含偶数行的表。 行形成具有相同信息但内容的对 交换的前两列中的。这是一个包含三列的示例:

1  2  3
=======
A  B  W 
B  A  W
C  D  X
D  C  X
E  F  Y
H  G  Z
F  E  Y
G  H  Z

我的实际表有更多列,但内容始终相同 在一对中。

我正在寻找能够摆脱每对中一行的SQL语句。 结果应如下所示:

1  2  3
=======
A  B  W 
C  D  X
E  F  Y
G  H  Z

我的表是由脚本生成的(我无法改变),所以我假设 我的输入是正确的(每行都有一个伙伴,行> = 3对于每一对都是相同的)。 可以检查这些先决条件的声明会非常酷。

4 个答案:

答案 0 :(得分:1)

如果每一行都有交换c1和c2的对应部分,则只选择c1和c2处于特定顺序的行(即c1

EXISTS部分确保仅显示具有对应项的行。如果要显示所有唯一行,无论它们是否具有对应行,请将最后一个条件从AND EXISTS更改为OR NOT EXISTS

SELECT * FROM myTable t1
WHERE c1 < c2
AND EXISTS (
    SELECT * FROM myTable t2
    WHERE t2.c1 = t1.c2
    AND t2.c2 = t1.c1
    AND t2.c3 = t1.c3
) ORDER BY c1

答案 1 :(得分:1)

类似的东西有助于使用 ROWNUM CTE

with test_Data as
(
SELECT COL1, COL2, COL3, ROWNUM ROWCOUNT FROM
(
SELECT 'A' COL1,  'B' COL2,  'W' COL3 FROM DUAL UNION
SELECT 'B' COL1,  'A' COL2,  'W' COL3 FROM DUAL UNION
SELECT 'C' COL1,  'D' COL2,  'X' COL3 FROM DUAL UNION
SELECT 'D' COL1,  'C' COL2,  'X' COL3 FROM DUAL 
) ORDER BY COL3, COL1
)
SELECT TAB1.COL1, TAB1.COL2, TAB1.COL3 FROM TEST_DATA TAB1, TEST_DATA TAB2
WHERE
TAB1.COL1 = TAB2.COL2
AND TAB1.COL2 = TAB2.COL1
AND TAB1.COL3 = TAB2.COL3
AND TAB1.ROWCOUNT = TAB2.ROWCOUNT+1;

没有testdata的查询将是,

with CTE as
(SELECT COL1, COL2, COL3, ROWNUM ROWCOUNT FROM MY_TABLE ORDER BY COL3,COL1)
SELECT TAB1.COL1, TAB1.COL2, TAB1.COL3 FROM CTE TAB1, CTE TAB2
WHERE
TAB1.COL1 = TAB2.COL2
AND TAB1.COL2 = TAB2.COL1
AND TAB1.COL3 = TAB2.COL3
AND TAB1.ROWCOUNT = TAB2.ROWCOUNT+1;

答案 2 :(得分:1)

您没有说明您的DBMS,因此这是ANSI SQL:

select least(c1,c2), 
       greatest(c1,c2), 
       min(c3) -- choose min or max to your liking
from the_table
group by least(c1,c2), greatest(c1,c2)

答案 3 :(得分:1)

对我而言,以下代码正常运作

DECLARE @TEST TABLE
(A CHAR(1),B CHAR(1),C CHAR(1))

INSERT INTO @TEST VALUES
('A','B','W'),
('B','A','W'),
('C','D','X'),
('D','C','X'),
('E','F','Y'),
('H','G','Z'),
('F','E','Y'),
('G','H','Z')

SELECT      MIN(A) [1],
            MAX(A) [2],
            C [3]
FROM        @TEST
GROUP BY    C

<强>结果:

enter image description here