我有2个表,tableA和tableB
tableA - id int
name varchar(50)
tableB - id int
fkid int
name varchar(50)
两个表都在id和fkid之间连接。
以下是tableA的示例行
以下是tableB的输出
我想加入两个表,只获取连接表的第一行。所以输出将如下所示
Id Name fkid
1 P1 1
2 P2 4
3 P3 null
如何通过单一查询实现此目的?我知道我可以在我的.net代码中循环并检索顶行。但我希望它在单个查询中。
答案 0 :(得分:2)
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
答案 1 :(得分:1)
你可以这样做:
;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
进行订单会更清楚答案 2 :(得分:1)
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