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

Откуда:
Сообщений: 165
Привет!
весь день бьюсь над запросом...

есть такие таблички:
+
declare @table1 table 
    (
        id      int,
        Field   int
    )
;  
declare @table2 table 
    (
        id      int,
        Field   int
    )
;
declare @table3 table 
    (
        id      int,
        Field   int,
        Val     int
    )
;          

insert @table1 (id, Field)
select 1,1 union
select 1,2 union
select 1,3 union
select 2,1 union
select 2,2 union
select 2,3

insert @table2 (id, Field)
select 2,2 union
select 2,3

insert @table3 (Id, Field, Val)
select 1,1,1250 union
select 1,2,1500 union
select 1,3,2000 union
select 2,1,2500 union
select 2,2,3500 union
select 2,3,4500


При помощи запроса:
select  t1.id,
        t1.Field,
        t3.Val
from    @table1 t1
join    @table3 t3
    on  t1.id = t3.id
    and t1.Field = t3.Field

получаю необходимые данные. Но этот запрос верен, только для случаев, когда точно известно, что в Table2 - нет связанных записей с Table1.

Нужно написать запрос, который смотрел в Table1, Table2, Table3 и показывал бы следующее:
id Field Val
111250
121500
132000
21NULL
223500
234500

Важное условие:
- если есть связи с Table1 и Table2 -> для Val должна быть связь Table2 - Table3
- если нет связи с Table1 и Table2 -> для Val должна быть связь Table1 - Table3

Спасибо!

MS SQL 2008R2
24 апр 13, 17:29    [14226055]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

Откуда:
Сообщений: 165
дополнение: в Table1 и Table3 - может быть ОЧЕНЬ много данных. до нескольких десятков миллионов строк. Есть индексы по всем этим полям.
24 апр 13, 17:31    [14226079]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Maxx
Member [скрыт]

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

union ?
24 апр 13, 17:34    [14226102]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
откуда на ваших данныхз взялась строчка
автор
2 1 NULL


?
24 апр 13, 17:38    [14226130]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5637
а что, лефт джоин не работает?
24 апр 13, 17:39    [14226141]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
qwerty112
Guest
whitebeast
id Field Val
111250
121500
132000
21NULL
223500
234500

чё эт тут NULL ? есть же соотв.запись в table3 ...
select  t1.id,
        t1.Field,
        t3.Val
from    @table1 t1
join    @table2 t2
    on  t1.id = t2.id
    and t1.Field = t2.Field
join    @table3 t3
    on  t2.id = t3.id
    and t2.Field = t3.Field

union all

select  t1.id,
        t1.Field,
        t3.Val
from    @table1 t1
join    @table3 t3
    on  t1.id = t3.id
    and t1.Field = t3.Field
left join    @table2 t2
    on  t1.id = t2.id
    and t1.Field = t2.Field
where t2.id is null

order by 1,2

id          Field       Val
----------- ----------- -----------
1           1           1250
1           2           1500
1           3           2000
2           1           2500
2           2           3500
2           3           4500
24 апр 13, 17:39    [14226142]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Maxx,qwerty112,
в этом то и вся проблема. Если ID(2) и Field(2,3) есть одновременно и в Table1 и в Table2, то Val для них брать только связывая Table2 и Table3. При этом Val для остальных записей из Table1 c ID-Field (1-1,1-2,1-3 и 2-1) должно браться связываясь с Table1-Table3.
24 апр 13, 17:43    [14226172]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Maxx
Member [скрыт]

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

бр , NULL все равно не будет...
Или почему тогда NULL только для 1 пары значений,а не для всех ????
24 апр 13, 17:47    [14226207]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

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

я не знаю как лучше объяснить... :(

Случай №1:
в Table2 и Table1 нету связанных строк -> ищем Val для Table1

Случай №2:
в Table2 есть часть строк из Table1 -> ищем Val для Table1 кроме тех, что есть в Table2, и ищем Val для Table2 которые есть в Table1, но для тех строк которых нет в Table1, Val должно быть NULL
24 апр 13, 18:01    [14226275]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
whitebeast
Случай №1:
в Table2 и Table1 нету связанных строк -> ищем Val для Table1

--case 1
select  t1.id,
        t1.Field,
        t3.Val
from   @table1 t1 

join    @table3 t3
    on  t1.id = t3.id
    and t1.Field = t3.Field
   where not exists(
       select 1
       from @table2
       where    t1.id = id
         and  t1.Field = Field
   ) 

так что ле ?

автор
Случай №2:
в Table2 есть часть строк из Table1 -> ищем Val для Table1 кроме тех, что есть в Table2, и ищем Val для Table2 которые есть в Table1, но для тех строк которых нет в Table1, Val должно быть NULL

Тогда у вас в постановке неправильный результат :((
Потому как у вас в Таб 2 есть пары 2,2 и 2,3 ..а NULL почему то для 2,1 у вас NULL
У вас просто нет ничего в Таб 2,чего бы не было в Таб 1
24 апр 13, 18:10    [14226303]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
qwerty112
Guest
whitebeast
Случай №2:
в Table2 есть часть строк id из Table1 -> ищем Val для Table1 кроме тех, что есть в Table2, и ищем Val для Table2 которые есть в Table1, но для тех строк id которых нет в Table1, Val должно быть NULL

может, это имеется в виду ?

select  1 as xz, t1.id,
        t1.Field,
        t3.Val
from    @table1 t1
join    @table3 t3
    on  t1.id = t3.id
    and t1.Field = t3.Field
where t1.id not in (select id from @table2)

union all

select  2 as xz, t1.id,
        t1.Field,
        t3.Val
from    @table1 t1
left join    @table2 t2
    on  t1.id = t2.id
    and t1.Field = t2.Field
left join    @table3 t3
    on  t2.id = t3.id
    and t2.Field = t3.Field
where t1.id in (select id from @table2)

order by 2,3

xz          id          Field       Val
----------- ----------- ----------- -----------
1           1           1           1250
1           1           2           1500
1           1           3           2000
2           2           1           NULL
2           2           2           3500
2           2           3           4500
24 апр 13, 18:18    [14226357]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Maxx, да не... результат должен быть именно таким.
с Case1 - у меня проблем нет. там все просто.
а вот с Case2... в общем попытаюсь собраться с мыслями и попозже попробую еще раз пояснить.

Пока спасибо за внимание :)
24 апр 13, 18:19    [14226359]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
Maxx
Member [скрыт]

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

може тада qwerty112 таки прав ?
24 апр 13, 18:20    [14226364]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

Откуда:
Сообщений: 165
qwerty112, спасибо! Вы разобрали мой несвязный бред... и выдали нужный запрос!
24 апр 13, 18:20    [14226365]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
whitebeast
Member

Откуда:
Сообщений: 165
Ваще блин, никому не советую работать когда болеешь (
Еще раз огромное всем спасибо.
24 апр 13, 18:22    [14226377]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с запросом  [new]
i-n-d-e-x
Member

Откуда:
Сообщений: 31
Оно?

select t3.id, t3.Field, t3.Val
from (
select distinct
id = case when t2.id is null then t1.id else t2.id end
,Field = case when t2.Field is null then t1.Field else t2.Field end
from @table1 t1
left join @table2 t2 on t1.id = t2.id -- and t1.Field = t2.Field
) tt
left join @table3 t3 on t3.id = tt.id and t3.Field = tt.Field

Id Field Val
1 1 1250
1 2 1500
1 3 2000
2 2 3500
2 3 4500
24 апр 13, 18:50    [14226480]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить