2012-03-08 2 views
0

У меня есть несколько таблиц, как это:SQL-запрос: двойная запись для соединений ... может, т понять это

I. родительская таблица:

id_client  id_group package  start_date end_date  id_contract is_parent 
1223   88   1234   2012-01-01 2050-01-01 156447  1   
1223   89   34342   2011-04-01 2050-01-01 156447  1 

II. Таблица Доля:

id  package  id_share 
1   1234   SS4433 - parent 
2   564679  SS4433 --- this is a child 
3   564522  SS4433 -- this is a child 
4   34342  SS2345 - parent 
5   665456  SS2345 -- child 
6   7789997  SS2345 -- child 

III. подчиненная таблица:

package  start_date end_date  id_contract  

564679  2011-01-01 2012-02-01 156447 
564522  2011-01-01 2011-05-07 156447 
665456  2011-01-01 2012-02-04 156447 
7789997  2011-01-01 2011-07-03 156447 

Вопрос заключается в том, чтобы выбрать с одним запросом родителей, и все это дети в такой же выбор (на основе id_share в долевом таблице), которая содержит группу родителя.

Результат должен выглядеть следующим образом:

id_client  id_group  package   start_date end_date id_contract child_of 
1223   88   1234   2012-01-01 2050-..  156447  0 
1223   88   564679   2011-01-01 2012-02-01 156447  1234 
1223   89   34342   2011-04-01 2050-... 156447  0 
1223   89   665456   2011-01-01 2012-02-04 156447  34342 

Я всячески .. но я не могу понять, как это сделать .. без объединения всех

Я попытался это:

select a.id_client, a.id_group, ??package?? , id_contract , ??child_of?? 
from parent_table a 
join share_table b on b.package = a.package 
join share_table c on c.id_share = b.id_share 
join child_table d on d.package = c.package 

PS: Мне нужно, чтобы найти родителей и Чайлдс, что corespond на 2012-01-01 - 2012-01-31 интервал

, где я поставил ?? я не знаю .

Thanks

+0

Каков запрос, который вы используете в настоящее время? –

+1

Я редактировал свой пост. Спасибо – pufos

+1

Почему вы не хотите использовать союз? –

ответ

1

ОБНОВЛЕНО, чтобы ограничить родитель и ребенок по дате:

select a.id_client, 
     a.id_group, 
     coalesce(d.package, a.package) package, 
     coalesce(d.start_date, a.start_date) start_date, 
     coalesce(d.end_date, a.end_date) end_date, 
     coalesce(d.id_contract, a.id_contract) id_contract, 
     case when d.package is not null then a.package else 0 end child_of 
from parent_table a 
join share_table b on b.package = a.package 
join share_table c on c.id_share = b.id_share 
left join child_table d on d.package = c.package and 
          d.start_date <= '2012-01-31' and 
          d.end_date >= '2012-01-01' 
where a.start_date <= '2012-01-31' and 
     a.end_date >= '2012-01-01' and 
     (d.package is not null or a.package = c.package) 
+0

Мне нужно поле пакета, чтобы содержать номер родительского пакета и следующий номер дочернего пакета ... 'a .package' будет содержать только номер пакета патента – pufos

+0

@pufos: запрос обновляется соответствующим образом. –

+0

Может потребоваться 'COALESCE (d.start_date, a.start_date) AS start_date' и' COALESCE (d.id_contract, a.id_contract) AS id_contract', но я думаю, что это все. –

0

Как насчет этого.

select p.id_client, p.id_group, s.package, c.start_date, c.id_contract 
from parent p right outer join share s 
on p.package = s.package 
right outer join child c 
on p.package = c.package; 
+0

позвольте мне попробовать, что – pufos

0

Объединение кажется более хорошим способом пойти, но это возможно с помощью IsNull и внешних соединений ...

select isnull(p.id_client, pofc.id_client) id_client, isnull(p.id_group, pofc.id_group) id_group, isnull(p.package, c.package) package, isnull(p.startDate, c.startDate), isnull(p.endDate, c.endDate) endDate, isnull(p.id_contract, c.id_contract) id_contract, isnull(pofc.package, 0) child_of 
from share s 
left outer join parent p on p.package = s.package and p.startDate <= @toDate and p.endDate >= @fromDate 
left outer join child c on c.package = s.package and c.startDate <= @toDate and c.endDate >= @fromDate  
left outer join (select ps.id_share, p.package, p.id_client, p.id_group from share ps inner join parent p on p.package = ps.package) pofc on pofc.id_share = s.share and pofc.package <> s.package 
where p.package is not null 
    or c.package is not null 
+0

Обновлено, чтобы включить требование диапазона дат – kaj

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