2016-03-02 66 views
0

我有一个简单的表2列:SQL选择不同的,但详尽列

Col1 | Col2 
-----+----- 
1 | 3 
1 | 4 
2 | 3 
2 | 4 
... many more rows 

我想回到这个:

Col1 | Col2 
-----+----- 
1 | 3 
2 | 4 

我不希望这样的:

Col1 | Col2 
-----+----- 
1 | 3 
2 | 3 

因为3在Col2中被复制,所以这也不是

Col1 | Col2 
-----+----- 
1 | 3 
1 | 4 

因为1在Col1中复制,也不是这

Col1 | Col2 
-----+---- 
1 | 3 

因为现在4在col2的缺失。换句话说,我不想重复,但我也不想省略col2中的任何值(除非它在Col1中出现重复 - 反之亦然)。我如何使用SQL来做我想做的事?谢谢。

+1

请看看这个:http://stackoverflow.com/questions/12188027/mysql-select-distinct-multiple-columns –

+0

谢谢,但没有这些解决方案的工作。 –

+2

当'col1'具有'1,1,2'和'col2'具有'3,4,5'时应该发生什么? –

回答

0

其按你给定的样本数据的工作

select col1, 
case 
when col1 =1 and col2 in (3,4) Then 3 
when col1 =2 and col2 in (3,4) Then 4 
end as col2 
from table1 
group by col1 

更多的细节去这里sql fiddle

0

我认为你需要这样的查询:

SELECT Col1, Col2 
FROM 
    (SELECT dt.*, @rownum1 := @rownum1 + 1 AS rn 
    FROM 
     (SELECT Col1 
     FROM t 
     GROUP BY Col1) dt, 
     (SELECT @rownum1 := 0) r) t1 
    LEFT OUTER JOIN 
    (SELECT dt.*, @rownum2 := @rownum2 + 1 AS rn 
    FROM 
     (SELECT Col2 
     FROM t 
     GROUP BY Col2) dt, 
     (SELECT @rownum2 := 0) r) t2 
    ON t1.rn = t2.rn 
UNION ALL 
SELECT Col1, Col2 
FROM 
    (SELECT dt.*, @rownum3 := @rownum3 + 1 AS rn 
    FROM 
     (SELECT Col2 
     FROM t 
     GROUP BY Col2) dt, 
     (SELECT @rownum3 := 0) r) t1 
    LEFT OUTER JOIN 
    (SELECT dt.*, @rownum4 := @rownum4 + 1 AS rn 
    FROM 
     (SELECT Col1 
     FROM t 
     GROUP BY Col1) dt, 
     (SELECT @rownum4 := 0) r) t2 
WHERE (t2.Col1 IS NULL); 
  1. 你需要不同具有行号的值为Col1
  2. 您还需要使用行号的不同值Col2
  3. 现在您可以通过使用UNION ALL来设置FULL OUTER JOIN这些不同的值ON行号。

[SQL Fiddle Demo]