2011-09-12 112 views
0

我有一個表如下:SQL服務器自聯接

table1 

col1 col2 col3 
1  A  1 
2  B  1 
3  A  2 
4  D  2 
5  X  3 
6  G  3 

現在我可以像下面的結果從上面的表格。以下結果集中的col2基於上面table1中的col3。在上面的table1 col2中,A和B在COL3(即1)中具有相同的id值,因此在結果集中,我們只是將它們分隔到新列中,依此類推。 A和D具有相同的ID COL3(即2),並且X和G在上面的表1中的COL3(即3)中具有相同的ID。 ANYONE可以編寫一個SQL查詢來獲得以下結果。

col1 col2  
    A  B 
    A  D 
    X  G 

回答

1

如果你的SQL Server 2005或更高版本上:

WITH ranked AS (
    SELECT 
    *, 
    rn = ROW_NUMBER() OVER (PARTITION BY col3 ORDER BY col2) 
    FROM table1 
) 
SELECT 
    col1 = r1.col2, 
    col2 = r2.col2 
FROM ranked r1 
    INNER JOIN ranked r2 ON r1.col3 = r2.col3 
WHERE r1.rn = 1 
    AND r2.rn = 2 
+0

使用此查詢的優勢比您之前發佈的查詢有什麼優勢。前一個更簡單易懂。 – niceApp

+0

這一個將解決組中有兩行以上的情況。它只會使用第一個(按col1排序)兩個值,而較簡單的解決方案會產生重複的數據。在3個項目的情況下:#1和#2,#2和#3,#1和#3。 –

+0

@mrp:我明白你選擇了更簡單的解決方案,因爲你知道在一個組中不會有兩個以上的項目。如果是這樣,這個人可能已經失去了一些珍貴。它仍然表現出一種不同的方法,一種替代方案其他人可能會覺得它有用。 –

0
select 
    a.col2 as "col1", 
    b.col2 as "Col2" 
from 
    table1 a 
    join table1 b on a.col3 = b.col3 
2
SELECT 
    t1.col2 as col1, 
    t2.col2 
FROM Table1 t1 
INNER JOIN Table1 t2 on t1.col3 = t2.col3 
WHERE t1.col1 > t2.col1 
+0

那麼,這是我從上述查詢得到的結果: (B,A) (A,B) (d,A) (A,d) (G,X) (X,G) – niceApp

+0

這是接近但仍然比需要更多的記錄。它有一些重複的數據,如B,A和A,B,我不想要。 – niceApp

+0

它應該比where子句中的符號大,而不是'<>'。對於那個很抱歉。 –

2
SELECT 
    col1 = t.col2, 
    col2 = t2.col2 
FROM table1 t 
    INNER JOIN table1 t2 ON t.col3 = t2.col3 AND t.col1 < t2.col1 
+0

它的工作原理。非常感謝您 – niceApp

0

隨着對錶結構的一些假設,即存在着COL3了整整2項col3中每一個獨特的價值。

DECLARE @table1 TABLE([col1] int, [col2] varchar, [col3] int); 
INSERT INTO @table1(col1, col2, col3) VALUES(1, 'A', 1); 
INTO @table1(col1, col2, col3) VALUES(2, 'B', 1); 
INSERT INTO @table1(col1, col2, col3) VALUES(3, 'A', 2); 
INSERT INTO @table1(col1, col2, col3) VALUES(4, 'D', 2); 
INSERT INTO @table1(col1, col2, col3) VALUES(5, 'X', 3); 
INSERT INTO @table1(col1, col2, col3) VALUES(6, 'G', 3); 

SELECT 
(SELECT TOP(1) t1.[col2] FROM @table1 AS t1 WHERE t1.[col3] = g.[GroupId] ORDER BY t1.[col1] ASC) AS [a], 
(SELECT TOP(1) t2.[col2] FROM @table1 AS t2 WHERE t2.[col3] = g.[GroupId] ORDER BY t2.[col1] DESC) AS [b] 
FROM 
(SELECT DISTINCT u.col3 AS [GroupId] FROM @table1 AS u) AS g