3

我需要加入 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
4

3 回答 3

3

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 建议的条件),它仍然会使事情模棱两可并给优化器一些余地 - 但您仍然必须提供规范

于 2013-07-17T06:50:20.050 回答
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 小提琴

于 2013-07-17T06:48:44.170 回答
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 演示

于 2013-07-17T06:48:47.043 回答