我需要加入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
答案 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 强>