越来越连接表

问题描述:

的顶行我有2个表,表A和tableB的越来越连接表

tableA - id int 
     name varchar(50) 

tableB - id int 
     fkid int 
     name varchar(50) 

两个表的ID和fkid之间的连接。

以下是表A

enter image description here

样本行下面是tableB的 enter image description here

输出我想加入这两个表,并得到连接表的只有最上面一行。所以输出会像下面

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

这里是Sql fiddle

我怎么能单查询实现这一目标?我知道我可以在我的.net代码中循环并检索顶部行。但我想在单个查询中。

+0

你是什么意思你想排在前列?你已经显示了3行不是1的预期输出,那么你究竟想要什么? – 2014-10-16 11:33:19

+0

@DanielAndré我说加入表格的第一行,而不是整行输出,只有一行 – Happy 2014-10-16 11:37:23

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 

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

+0

@Danila写的查询更简单。使用Row_Number的任何特定原因?你的查询也给出了正确的输出 – Happy 2014-10-16 11:32:22

+0

@Happy:更新了答案 – Arion 2014-10-16 11:39:45

+0

不,没有更多的列。另外它很难将你的查询转换成linq。你认为它很容易转换您的查询到LINQ? – Happy 2014-10-16 11:47:05

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