Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Left Join - из правой таблицы нужно получить только одну строку  [new]
alex2808
Member

Откуда:
Сообщений: 238
Делаю объединение

select t1.id, t2.name
from table1 t1
left join table2 t2
on t1.id=t2.outid

Исторически сложилось, что в t2 может быть больше чем одна строка, где outid идентичны.

можно ли как то запросом при объединении взять из table2 только 1-ю совпадающую строчку?
17 апр 12, 18:33    [12429417]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
iljy
Member

Откуда:
Сообщений: 8711
alex2808,

можно. С помощью ROW_NUMBER() или cross apply.
17 апр 12, 18:36    [12429426]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
alex2808
Member

Откуда:
Сообщений: 238
iljy
alex2808,

можно. С помощью ROW_NUMBER() или cross apply.


Интересно, и как тут привязать ROW_NUMBER() OVER(ORDER BY...) к правой таблице в вышеуказанной примере?
17 апр 12, 18:42    [12429440]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
nezhadnye_my
Guest
with table1 as 
(select 1 as id union all select 2),

table2 as
(select 1 as outid, '1a' as name union all
 select 1, '1b' union all
 select 2, '2a' union all
 select 2, '2b' ),
 
 t2_rn as(
 select ROW_NUMBER() over (partition by outid order by (select 1)) as rn,
        *
from table2)        

select t1.id, 
       t2_rn.name 
from table1 t1
	left join t2_rn
	on t1.id=t2_rn.outid and t2_rn.rn = 1
17 апр 12, 19:00    [12429491]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
alex2808
Member

Откуда:
Сообщений: 238
nezhadnye_my,
спасибо, все получилось
18 апр 12, 23:14    [12436376]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Можно это сделать без ORDER BY, можно только средствами стандартного SQL. У вас должно быть условие, по которому вы выбираете, какая из нескольких строк с одинаковым outid в таблице table2 подходит и объединять не с table2, а с подзапросом такого вида:

select * from table2 where условие_для_строки

В итоге в запросе это будет выглядеть следующим образом:

select t1.id, t2.name
from table1 t1
left join (
select * from table2 where условие_для_строки
) t2
on t1.id=t2.outid


Я понятно выразился? Рассчитываю на ответ)
18 апр 12, 23:45    [12436469]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
kikki
Можно это сделать без ORDER BY, можно только средствами стандартного SQL. У вас должно быть условие, по которому вы выбираете, какая из нескольких строк с одинаковым outid в таблице table2 подходит и объединять не с table2, а с подзапросом такого вида:

select * from table2 where условие_для_строки

В итоге в запросе это будет выглядеть следующим образом:

select t1.id, t2.name
from table1 t1
left join (
select * from table2 where условие_для_строки
) t2
on t1.id=t2.outid


Я понятно выразился? Рассчитываю на ответ)

Выразились понятно, но от этого конь не стал менее сферическим в менее газонасыщенном пространстве. Все легитимные способы при таком уровне подробностей задачи предложил iljy, еще в самом первом посте 12429426.
18 апр 12, 23:58    [12436525]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
SomewhereSomehow,

Нет, позвольте не согласиться! Способ уважаемого коллеги iljy нельзя считать легитимным. Что значит "только первая совпадающая строчка"? Первая по дате ввода? Первая по алфавиту, если смотреть на значение какого-то ее атрибута (кстати, в этом случае в предложенном мной подзапросе нужно будет использовать MIN и GROUP BY)? "Первой" строчка не может быть. Строчка может удовлетворять условию или не удовлетворять. Для этого не подходят соображения iljy.
19 апр 12, 00:12    [12436576]     Ответить | Цитировать Сообщить модератору
 Re: Left Join - из правой таблицы нужно получить только одну строку  [new]
iljy
Member

Откуда:
Сообщений: 8711
kikki
SomewhereSomehow,

Нет, позвольте не согласиться! Способ уважаемого коллеги iljy нельзя считать легитимным. Что значит "только первая совпадающая строчка"? Первая по дате ввода? Первая по алфавиту, если смотреть на значение какого-то ее атрибута (кстати, в этом случае в предложенном мной подзапросе нужно будет использовать MIN и GROUP BY)? "Первой" строчка не может быть. Строчка может удовлетворять условию или не удовлетворять. Для этого не подходят соображения iljy.

Именно поэтому конь весьма сферический. Ваше условие может отсекать не одну строку, а несколько, из которых надо выбрать "первую" в том или ином (или произвольном) порядке. В подзапросе использовать MIN и GROUP BY можно конечно, вот только минумум может браться по одному полю, а значение требоваться из другого (более чем часто встречающаяся задача - взять последнее значение по дате). Можно делать еще одну группировку (что сложнее, чем использовать ROW_NUMBER, и в некоторых случаях недостаточно - минимальных дат может быть несколько, хотя в других случаях может быть и выгоднее), можно объединять поля в строку и группировать эти строки, можно использовать кореллированные подзапросы (что есть частный случай CROSS APPLY), в общем много чего можно придумать, но, как вам уже сказали, менее сферическим конь не станет.
19 апр 12, 00:30    [12436639]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить