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

Откуда:
Сообщений: 2083
Здравствуйте! Есть три таблицы (одна главная и две подчиненные)

Главная таблица
idxnaim
1Договор 1
2Договор 2
3Договор 3

Субподрядчики-1
idxaa
1Значение 1
1Значение 11
2Значение 2

Субподрядчики-2
idxbb
1Показатель 10
1Показатель 20
3Показатель 30

Надо получить результат:
idxnaimval
1Договор 1Значение 1
1Договор 1Значение 11
2Договор 2Значение 2
3Договор 3Показатель 30

Здесь логика такая:
- первая подчиненная таблица имеет приоритет над второй
- на главную таблицу вешаем все записи из 1-й подчиненной
- если нужного idx нет в первой таблице, то берем запись из 2-й таблицы (idx=3 отсутствует в 1-й таблице, но есть во второй)

Исходные данные
declare @main table (idx int, naim varchar(50))
declare @a table (idx int, aa varchar(50))
declare @b table (idx int, bb varchar(50))

insert @main values(1, 'Договор 1'), (2, 'Договор 2'), (3, 'Договор 3')
insert @a values(1,'Значение 1'), (1,'Значение 11'), (2,'Значение 2')
insert @b values(1,'Показатель 10'), (1,'Показатель 20'), (3,'Показатель 30')

select * from @main  select * from @a  select * from @b
Максимум до чего додумался
select * from @main main
left join @a a on main.idx = a.idx
left join @b b on main.idx = b.idx and a.idx <> b.idx
17 окт 14, 11:32    [16719090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
Добрый Э - Эх
Guest
user89,

осталось почитать пол coalesce/isnull и будет тебе полное счастье...
17 окт 14, 11:38    [16719146]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
user89,

осталось почитать пол про coalesce/isnull и будет тебе полное счастье...
17 окт 14, 11:40    [16719165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
user89
Member

Откуда:
Сообщений: 2083
Добрый Э - Эх,

мой запрос выше возвращает такой результат
idxnaimidxaaidxbb
1Договор 11Значение 1NULLNULL
1Договор 11Значение 11NULLNULL
2Договор 22Значение 2NULLNULL
3Договор 3NULLNULLNULLNULL

Значения из 2-й таблицы не вывелись :(   Уверен, решение несложное, но не соображу как...
17 окт 14, 11:42    [16719187]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
Добрый Э - Эх
Guest
user89,

так попробуй (дословный перевод твоей "логики" на английский с последующим переводом на сиквельный):
select m.* , coalesce(a.aa, b.bb) as aa_bb
  from main m
  left join a
    on m.idx = a.idx
  left join
       (
          select * 
            from b 
           where not exists(select null from a where a.idx = b.idx)
       ) b
    on m.idx = b.idx
17 окт 14, 11:52    [16719296]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
Добрый Э - Эх
Guest
ну или избавившись от формально ненужного деривед-тэебла:
select m.* , coalesce(a.aa, b.bb) as aa_bb
  from main m
  left join a
    on m.idx = a.idx
  left join b 
    on m.idx = b.idx
   and not exists(select null from a where a.idx = b.idx)
17 окт 14, 11:55    [16719328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
select main.idx,main.naim
,ISNULL(a.aa,b.bb) as aabb 
from @main main
left join @a a on main.idx = a.idx
left join @b b on main.idx = b.idx  and a.idx is null
17 окт 14, 11:55    [16719329]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Хитрый join  [new]
user89
Member

Откуда:
Сообщений: 2083
Добрый Э - Эх, LexusR

спасибо! Все варианты работают правильно!
17 окт 14, 12:05    [16719454]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить