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

Откуда:
Сообщений: 1389
Есть таблицы
t1 (vcode int,numb int)
t2 (vcode int,pcode int,numb int)
t3 (vcode int,pcode int,numb int)
t4 (vcode int,pcode int,numb int)
t5 (vcode int,pcode int,numb int)
t6 (vcode int,pcode int,numb int)


Таблицы со 2-й по 6-ю связаны с 1-й по связке t1.vcode=tN.pcode

в разных случаях для t1 количество записей в t1-t6 разное, и когда начинаешь собирать их left join, то соответственно записи двоятся, троятся, что делать в этом случае?
Должна получаться запись вида

t1  t2     t3 ... t6
1   1      1       1
2   2      2       null
3   null   3       null


Мне в голову пришла мысль каждый раз для каждой записи t1 считать максимальное кол-во записей среди t2-t6, пронумеровывать их,
затем все остальные таблицы приджойнивать к той, в которой запись максимальная

Но я больше чем уверен, есть другие варианты решения этой задачи, кто знает какие, подскажите пожалуйста
24 авг 16, 12:07    [19583641]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
KRS544
Member

Откуда:
Сообщений: 497
RMagistr2015,
t1  t2     t3 ... t6
1   1      1       1
2   2      2       null
3   null   3       null

3 - я строка left join не получится?
есть другие варианты решения этой задачи

Так какая задача то?
24 авг 16, 12:23    [19583734]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
aleks2
Guest
KRS544
Так какая задача то?

Сделайте мне красиво!
24 авг 16, 12:27    [19583758]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
RMagistr2015
Member

Откуда:
Сообщений: 1389
KRS544
RMagistr2015,
t1  t2     t3 ... t6
1   1      1       1
2   2      2       null
3   null   3       null

3 - я строка left join не получится?
есть другие варианты решения этой задачи

Так какая задача то?


Не получится, там задваиваются строки
задача сделать что бы не задваивались
24 авг 16, 12:29    [19583772]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
KRS544
Member

Откуда:
Сообщений: 497
select *
from t1 outer apply (select top 1 * from t2 where t1.vcode=t2.pcode order by pcode desc) x2
           outer apply (select top 1 * from t3 where x2.vcode=t3.pcode order by pcode desc) x3
.....
24 авг 16, 12:34    [19583803]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
iljy
Member

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

1. Для каждой tN используйте ROW_NUMBER() over(partition by pcode order by ...)
2. результаты соединяете FULL JOIN по pcode и RN.
3. к результату RIGHT JOIN t1
24 авг 16, 12:36    [19583819]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
KRS544
Member

Откуда:
Сообщений: 497
order by pcode desc - замените на свое правило
24 авг 16, 12:36    [19583826]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
RMagistr2015
Member

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

1. Для каждой tN используйте ROW_NUMBER() over(partition by pcode order by ...)
2. результаты соединяете FULL JOIN по pcode и RN.
3. к результату RIGHT JOIN t1


Так интересно, а вы то же для идентификации row_number() используете алиаз RN ? Прикольно ))))
Я её так и решил, но думал может есть другой способ
Потому как мне пришлось делать циклы и добавлять потом всё это во временную результирующую таблицу
24 авг 16, 13:36    [19584347]     Ответить | Цитировать Сообщить модератору
 Re: Задача  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
RMagistr2015
Потому как мне пришлось делать циклы и добавлять потом всё это во временную результирующую таблицу
Можно и без циклов с временными таблицами. Вам iljy уже написал как.
declare @t1 table (id int primary key);
declare @t2 table (id int primary key, master_id int, v int);
declare @t3 table (id int primary key, master_id int, v int);
declare @t4 table (id int primary key, master_id int, v int);
declare @t5 table (id int primary key, master_id int, v int);
declare @t6 table (id int primary key, master_id int, v int);

insert into @t1 values (1), (2);;
insert into @t2 values (1, 1, 0), (2, 1, 1);
insert into @t3 values (1, 1, 3);
insert into @t4 values (1, 1, 4), (2, 1, 5), (3, 1, 6);
insert into @t5 values (1, 1, 7);

select
 t1.id, t2.v as v2, t3.v as v3, t4.v as v4, t5.v as v5, t6.v as v6
from
 @t1 t1 left join
 (
  (select master_id, v, row_number() over (partition by master_id order by (select 1)) as rn from @t2) t2 full join
  (select master_id, v, row_number() over (partition by master_id order by (select 1)) as rn from @t3) t3 on t3.master_id = t2.master_id and t3.rn = t2.rn full join
  (select master_id, v, row_number() over (partition by master_id order by (select 1)) as rn from @t4) t4 on t4.master_id = coalesce(t2.master_id, t3.master_id) and t4.rn = coalesce(t2.rn, t3.rn) full join
  (select master_id, v, row_number() over (partition by master_id order by (select 1)) as rn from @t5) t5 on t5.master_id = coalesce(t2.master_id, t3.master_id, t4.master_id) and t5.rn = coalesce(t2.rn, t3.rn, t4.rn) full join
  (select master_id, v, row_number() over (partition by master_id order by (select 1)) as rn from @t6) t6 on t6.master_id = coalesce(t2.master_id, t3.master_id, t4.master_id, t5.master_id) and t6.rn = coalesce(t2.rn, t3.rn, t4.rn, t5.rn)
 ) on t1.id = coalesce(t2.master_id, t3.master_id, t4.master_id, t5.master_id, t6.master_id)
24 авг 16, 14:16    [19584632]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить