SQL Server自联接

时间:2011-09-12 23:20:42

标签: sql sql-server

我有一张表格如下:

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中具有相同的id值(即1),因此在结果集中我们只是将它分隔在新列中,依此类推。 A和D具有相同的id COL3(即2),并且X和G在上表1中的COL3(即3)中具有相同的id。任何人都可以编写一个SQL查询来获得以下结果。

   col1   col2    
     A      B 
     A      D
     X      G

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

select
    a.col2 as "col1",
    b.col2 as "Col2"
from
    table1 a
    join table1 b on a.col3 = b.col3

答案 4 :(得分:0)

对表结构有一些假设,即col3中对于col3中的每个唯一值,恰好存在2个条目。

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