具有多列连接时,SQL JOIN限制为前1

时间:2013-07-17 06:30:35

标签: sql

我需要加入2个表

tableA
----------
colA   colB
A      1
B      2
C      3
D      4

tableB
----------
colC  ColD ColE...
A     A    X
A     B    X
A     C    X
B     A    Y
B     B    Y
B     C    Y

以前我会加入这个表格:

SELECT *
FROM tableA a
JOIN tableB b
ON b.ColC =                  --This column SHOULD NORMALLY be a unique key column
    (SELECT TOP 1 tempB.ColC
     FROM tableB tempB
     WHERE a.ColA = tempB.ColC
     AND ...(other requirements here)
    )

但是这不起作用,因为在这个例子中没有单一的唯一列。

编辑: 所需的输出是一对一的连接,以获取table2的columnE中的值以供在其他地方使用。

再次编辑: 期望的输出 -

ColA ColB ColC ColE ColD
A    1    A    X    any value of a,b,c (doesn't matter)
B    2    B    Y    any value of a,b,c

3 个答案:

答案 0 :(得分:2)

select a.colA,a.colB,b.ColC,b.ColE,b.ColD
from tableA a
inner join (select ColC,max(ColD) as ColD,max(ColE) ColE 
            from tableB
            group by colC)b
on a.colA=b.colC

<强> SQL FIDDLE

答案 1 :(得分:2)

SQL没有“无关紧要” 1 。假设您正在使用支持窗口函数的数据库系统,那么这应该可以工作:

SELECT *
FROM tableA a
JOIN (select *,ROW_NUMBER() OVER (PARTITION BY ColC ORDER BY ColD) as rn
      from tableB) b
ON b.ColC = a.ColC and
   b.rn = 1

在这个例子中,我已经确定要选择的行是最早按ColD排序的行。

1 我的意思是,即使不关心选择什么,你也必须给SQL一个你想要选择的规范。如果你实际上并不关心,你可能会选择一个条件(例如@Martin Smith建议的条件)仍然会使事情变得模棱两可并为优化器留出一些余地 - 但你仍然必须提供 a 规范

答案 2 :(得分:1)

您可以在子查询或GROUP BY中使用ROW_NUMBER()(您尚未指定RDBMS,但根据TOP 1猜测SQL Server)

Group By版本:

;WITH CTE_Group AS
(
  SELECT colC, MIN(ColE) ColE FROM TableB
  GROUP BY colC
)
SELECT a.ColA, a.ColB, b.ColE 
FROM TableA a
LEFT JOIN CTE_Group b on a.ColA = b.ColC;

Row_Number()版本:

;WITH CTE_RN AS
(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY ColC ORDER BY ColD) RN
  FROM TableB
)
SELECT a.ColA, a.ColB, b.ColE 
FROM TableA a
LEFT JOIN CTE_RN b on a.ColA = b.ColC AND b.RN = 1;

<强> SQLFiddle DEMO