2015-06-28 16 views
-1

Есть 3 таблицы:Написание запроса для отображения следующего результата?

Таблица A:

code aname 
------- --------- 
1  A 
2  B 
3  C 

Таблица B:

code  bname 
----------- ---------- 
1   aaa 
1   bbb 
2   ccc 
2   ddd 

Таблица С:

code  cname 
----------- ---------- 
1   xxx 
1   yyy 
1   zzz 
2   www 

Мы должны написать запрос, который будет отображать следующий результат:

code  aname  bname   cname 
----------- ---------- ----------  ---------- 
1   A   aaa    xxx 
1   A   bbb    yyy 
1   A   NULL    zzz 
2   B   ccc    www 
2   B   ddd    NULL 
3   C   NULL    NULL 
+1

Что вы пробовали? Покажите нам свой текущий запрос и сообщите нам, что с ним не так! – jarlh

+0

Сделайте «LET JOIN» ч/б всех таблиц. – Rahul

+0

Какую базу вы используете? –

ответ

0

Вам нужно будет установить колонку заказа TableB и TableC, так как кажется, что их число важно. Я собираюсь использовать CTEs, которые поддерживаются многими системами, но вместо этого вы можете делать подзапросы.

with tbb as (
    select 
    * 
    ,row_number() over (partition by code order by bname) nameorder 
    from 
    TableB 
), tbc as (
    select 
    * 
    ,row_number() over (partition by code order by cname) nameorder 
    form 
    TableC 
), mrg as (
    select 
    coalesce(tbb.code, tbc.code) code 
    ,bname 
    ,cname 
    from 
    tbb 
    full outer join tbc on 
     tba.code = tbb.code 
     and tba.nameorder = tbb.nameorder 
) 
select 
    tba.code 
    ,aname 
    ,bname 
    ,cname 
from 
    TableA tba 
    left outer join mrg on tba.code = mrg.code 
+0

Спасибо за вышеуказанный запрос. Я пробовал делать левое соединение во всех таблицах, но значения NULL не показывались up также попытался сделать все возможные объединения и группы, но все еще был застрял. Спасибо за помощь. – Vicky

0

Вы не полный join ключ, потому что вы хотите списки в каждом столбце. Чтобы получить это, вам нужно использовать full outer join и генерировать ключи для заказа. Примечание: окончательный порядок в каждом столбце произвольный.

select coalesce(a.code, b.code, c.code) as code, 
     a.aname, b.bname, c.cname 
from (select a.*, row_number() over (partition by code order by code) as seqnum 
     from a 
    ) a full outer join 
    (select b.*, row_number() over (partition by code order by code) as seqnum 
     from b 
    ) b 
    on a.code = b.code and a.seqnum = b.seqnum full outer join 
    (select c.*, row_number() over (partition by code order by code) as seqnum 
     from c 
    ) c 
    on c.code in (a.code, b.code) and c.seqnum in (a.seqnum, b.seqnum) 
+0

Хотя это функциональный запрос, я сомневаюсь, что ОП поймет его, и, глядя на его вопрос, я бы действительно задал вопрос он * «Что вы хотите делать вообще ...?» * Подобные запросы интересны, если вы хотите делать SQL-загадки или экзамен студента или теоретические исследования. Но мне кажется, что ОП хотел сделать что-то очень простое, и поэтому мы должны спросить, что он хотел сделать вообще. Я уверен, что решение, которое ему действительно нужно, намного проще ... –

+0

BTW, это разница между * программистом * и * инженером-программистом *: * программист * задает вопрос клиентом и делает * точно * что сказал клиент. Нет вопросов. Даже если решение полностью сложно. Он предполагает, что клиент является ИТ-специалистом. * Инженер-программист * идет дальше и спрашивает себя * «Чего хочет клиент вообще?» * - И разговаривает с клиентом, пытается понять его, а затем находит прочное и простое решение. –

+0

@SQLPolice. , , Еще раз, я понятия не имею, каковы ваши возражения в ответ, который правильно решает вопросы OPs и является стандартным SQL. Вы должны сохранить свои диатрибы для другого форума, что более подходит для таких комментариев. –

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