获得连接表的顶行

时间:2014-10-16 11:22:05

标签: sql sql-server sql-server-2012

我有2个表,tableA和tableB

tableA - id int
         name varchar(50)

tableB - id int
         fkid int
         name varchar(50)

两个表都在id和fkid之间连接。

以下是tableA的示例行

enter image description here

以下是tableB的输出 enter image description here

我想加入两个表,只获取连接表的第一行。所以输出将如下所示

Id          Name         fkid
 1          P1              1
 2          P2              4
 3          P3            null

这是Sql fiddle

如何通过单一查询实现此目的?我知道我可以在我的.net代码中循环并检索顶行。但我希望它在单个查询中。

3 个答案:

答案 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

Demo here

或没有窗口功能。像这样:

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

Demo here

<强>更新

我选择使用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