2013-12-24 3 views
1

У меня есть SQL-запрос:подзапросов с несколькими полями

SELECT DISTINCT t1.inn, 
       t1.idx, 
       (SELECT TOP 1 adr 
       FROM t2 
       WHERE t2.idx = t1.idx 
         AND t2.inn = t1.inn) ADR, 
       (SELECT TOP 1 name 
       FROM t2 
       WHERE t2.idx = t1.idx 
         AND t2.inn = t1.inn) NAME 
FROM t1 

Можно ли сделать один подзапрос вместо двух? (т. е. одновременно выберите TOP 1 ADR и NAME). Сервер: MS SQL 2008-2012.

+1

Вы используете 'TOP' без' ORDER BY'. Какой результат вы ожидаете? –

+0

Я хочу получить уникальные комбинации INN и IDX с некоторыми ADR и NAME. Каждой паре INN-IDX соответствует номер ADR-NAME. Я хочу получить любую из них (независимо от того, что именно). Напр. в таблице существуют 3 строки: INN = 111, IDX = 101, ADR = A1, NAME = N1; INN = 111, IDX = 101, ADR = B1, NAME = N1; INN = 222, IDX = 202, ADR = A2, NAME = N2; Я хотел бы получить результат с двумя строками: INN = 111, IDX = 101 и INN = 222, IDX = 202, с любым ADR (то есть не имеет значения A1 или B1 для первой строки) – Andrey

ответ

5

Вы можете сделать это с cross apply:

select distinct t1.INN, t1.IDX, t2.adr, t2.name 
from t1 cross apply 
    (select top 1 adr, name 
     from t2 
     where t2.idx = t1.idx and t2.inn = t1.inn 
    ) t2; 

Однако, вы выбираете одну строку без приказа. Если имеется только одна строка, то вы можете сделать это с помощью обычного соединения.

+0

Отлично! Большое спасибо. – Andrey

+0

Не только одна строка соответствует, но я не использую порядок, потому что не имеет значения, какие именно ADR и NAME будут выбраны. Мне просто нужен один ADR/NAME для каждого отдельного INN/IDX – Andrey

+0

Awesome. Спасибо за идею! – veeTrain

Смежные вопросы