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

Откуда: Münster, Germany
Сообщений: 1738
Доброе время суток!

есть запрос
напр,
SELECT TABLE1.FIELD1_1 ,TABLE2.FIELD2_5,TABLE3.FIELD3_4
FROM TABLE1 
LEFT JOIN TABLE2 ON TABLE1.FIELD1_2=TABLE2.FIELD2_1 
LEFT JOIN TABLE3 ON TABLE2.FIELD2_2=TABLE3.FIELD3_1 
WHERE TABLE3.FIELD3_3>0 
ORDER BY TABLE2.FIELD1_4


Всё ничего но из TABLE2 и TABLE3 надо выбрать только первую запись удовлетворяющую какому либо условию, причем сортировка тоже важна. Как реализовать такое без подзапроса? Можно ли в JOIN задать сортировку и TOP 1.

Возможно ли разрешить такую ситуацию одним запросом? Понятно что можно написать процедуру на стороне сервера которая делает это, но работа ведётся на стороне клиента и хочется остаться в рамках ANSI SQL.

Если нельзя остаться в рамках ANSI SQL но сделать все одним запросом в MSSQL 2008+ тоже интересно.

Спасибо.
18 апр 12, 18:06    [12435044]     Ответить | Цитировать Сообщить модератору
 Re: Join с TOP и ORDER BY  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
но сделать все одним запросом в MSSQL 2008+ тоже интересно


LEFT OUTER заменить на OUTER APPLY с корелляционным подзапросом с TOP 1 и ORDER BY.
18 апр 12, 18:16    [12435093]     Ответить | Цитировать Сообщить модератору
 Re: Join с TOP и ORDER BY  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Вам надо использовать не ORDER и TOP, а MAX( ) или MIN( ).

Пример. Есть таблица tab1 с полями lattr1,attr2,attr3,num1,num2. Допустим, вам нужно получить строку, у который attr1 первый по алфавиту (предположим, что поле attr1 имеет строковый тип). Тогда вам подойдет такой подзапрос:

Select
MIN(attr1),
attr2,
attr3,
num1,
num2

from
tab1

group by
attr2,
attr3,
num1,
num2
18 апр 12, 18:17    [12435099]     Ответить | Цитировать Сообщить модератору
 Re: Join с TOP и ORDER BY  [new]
Mikhail Tchervonenko
Member

Откуда: Münster, Germany
Сообщений: 1738
pkarklin,

Спасибо всем
18 апр 12, 18:21    [12435127]     Ответить | Цитировать Сообщить модератору
 Re: Join с TOP и ORDER BY  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Позвольте узнать, вам подошел мой вариант? Ответьте, пожалуйста, это очень интересно. И я должен понять, правильно ли я вас понял.
18 апр 12, 18:23    [12435136]     Ответить | Цитировать Сообщить модератору
 Re: Join с TOP и ORDER BY  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Mikhail Tchervonenko
Доброе время суток!

есть запрос
напр,
SELECT TABLE1.FIELD1_1 ,TABLE2.FIELD2_5,TABLE3.FIELD3_4
FROM TABLE1 
LEFT JOIN TABLE2 ON TABLE1.FIELD1_2=TABLE2.FIELD2_1 
LEFT JOIN TABLE3 ON TABLE2.FIELD2_2=TABLE3.FIELD3_1 
WHERE TABLE3.FIELD3_3>0 
ORDER BY TABLE2.FIELD1_4


Всё ничего но из TABLE2 и TABLE3 надо выбрать только первую запись удовлетворяющую какому либо условию, причем сортировка тоже важна. Как реализовать такое без подзапроса? Можно ли в JOIN задать сортировку и TOP 1.

Возможно ли разрешить такую ситуацию одним запросом? Понятно что можно написать процедуру на стороне сервера которая делает это, но работа ведётся на стороне клиента и хочется остаться в рамках ANSI SQL.

Если нельзя остаться в рамках ANSI SQL но сделать все одним запросом в MSSQL 2008+ тоже интересно.

Спасибо.
WHERE TABLE3.FIELD3_3>0 выбрасывает из результата все записи, в которых TABLE3.FIELD3_3 IS NULL, полученные в результате применения LEFT JOIN
Поэтому LEFT JOIN становится неотличимым от INNER JOIN И не имеет смысла.
18 апр 12, 19:58    [12435584]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить