2014-10-16 3 views
1

У меня 2 таблицы, TableA и TableBполучать верхний ряд присоединяемой таблицы

tableA - id int 
     name varchar(50) 

tableB - id int 
     fkid int 
     name varchar(50) 

Обе таблицы соединены между идентификатором и 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-коде и получить верхние строки. Но я хочу его в одном запросе.

+0

что вы имеете в виду вы хотите верхнюю строку? вы показали ожидаемый результат с 3 строками не 1, так что именно вы хотите? –

+0

@ DanielAndré Я сказал, что верхняя строка из объединенного стола и не весь вывод всего 1 строка – Happy

ответ

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

Update:

Причина, почему я выбираю сделать это с row_number в том, что если есть несколько столбцов в TableB то пример. Тогда нет необходимости в дополнительном агрегате, если вы хотите показать больше столбцов. Для меня лично это более ясно, с заказом на на ID

+0

. Запрос, написанный @Danila, проще. Любые конкретные причины использования Row_Number? Ваш запрос также дает правильный результат – Happy

+0

@Happy: Обновлен ответ – Arion

+0

Нет столбцов больше. Также его бит трудно конвертировать ваш запрос в linq. Как вы думаете, легко ли конвертировать ваш запрос в linq? – Happy

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 
Смежные вопросы