越来越连接表
问题描述:
的顶行我有2个表,表A和tableB的越来越连接表
tableA - id int
name varchar(50)
tableB - id int
fkid int
name varchar(50)
两个表的ID和fkid之间的连接。
以下是表A
样本行下面是tableB的
输出我想加入这两个表,并得到连接表的只有最上面一行。所以输出会像下面
Id Name fkid
1 P1 1
2 P2 4
3 P3 null
这里是Sql fiddle
我怎么能单查询实现这一目标?我知道我可以在我的.net代码中循环并检索顶部行。但我想在单个查询中。
答
select ta.id, ta.name, min(tb.id) from tableA ta
left join tableB tb on tb.fkid=ta.id
group by ta.id, ta.name
答
你可以这样做:
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY fkID ORDER BY ID) AS RowNbr,
tableB.*
FROM
tableB
)
SELECT
*
FROM
tableA
LEFT JOIN CTE
ON CTE.fkID=tableA.id
AND CTE.RowNbr=1
或者无窗的功能。就像这样:
SELECT
*
FROM
tableA
LEFT JOIN
(
SELECT
ROW_NUMBER() OVER(PARTITION BY fkID ORDER BY ID) AS RowNbr,
tableB.*
FROM
tableB
) as tbl
ON tbl.fkID=tableA.id
AND tbl.RowNbr=1
更新:
我为什么选择与ROW_NUMBER这样做的原因是,如果TableB中更多的列,则例子。那么如果你想显示更多的列,则不需要额外的聚合。对于我个人来说是一个为了更清晰通过对ID
答
select a.id,a.name,b.fid from tableA a left join
(
select min(id) fid ,fkid from tableB group by fkid
)b
on a.id = b.fkid
你是什么意思你想排在前列?你已经显示了3行不是1的预期输出,那么你究竟想要什么? – 2014-10-16 11:33:19
@DanielAndré我说加入表格的第一行,而不是整行输出,只有一行 – Happy 2014-10-16 11:37:23