2011-09-12 64 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