T-SQL:如何在不创建额外行的情况下连接表 - 需要一行到一行的对应关系

时间:2011-09-08 11:24:03

标签: sql-server tsql join iteration sql-server-2008-r2

我有一个场景,我需要加入两个SQL表,并且正在努力解决这个问题。 让我们在表A中说,我有这个:

ColA  ColB   ColC   ColD
45     55     17     45
45     55     17     47
45     55     17     49
45     55     17     51

在表B中我有这个:

ColA  ColB   ColC   ColE
45     55     17     55
45     55     17     56
45     55     17     57
45     55     17     58

我需要创建一个看起来像这样的表 - 只注意4行,而不是我正在使用的内连接产生的16行。

ColA  ColB   ColC   ColD   ColE
45     55     17     45     55
45     55     17     47     56
45     55     17     49     57
45     55     17     51     58

我几乎没有想法。两个表总是具有相同的行数。有没有办法使用连接执行此操作,还是应该遍历表A(即获取行号)并获取表B中的匹配行号?

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:5)

至少假设SQL Server 2005

WITH T1
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY ColA, ColB, ColC ORDER BY ColD)
                RN
         FROM   TableA),
     T2
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY ColA, ColB, ColC ORDER BY ColE)
                RN
         FROM   TableB)
SELECT T1.ColA,
       T1.ColB,
       T1.ColC,
       T1.ColD,
       T2.ColE
FROM   T1
       JOIN T2
         ON T1.ColA = T2.ColA
            AND T1.ColB = T2.ColB
            AND T1.ColC = T2.ColC
            AND T1.RN = T2.RN