2016-06-22 2 views
0

у меня есть 3 таблицы в базе данныхОбъединение двух или более таблиц, которые не имеют общих полей

Project    Material Used   Document 
------------  -------------------  ------------------------ 
PID | Name   MID | PID | Name   DocID | PID | Date 
------------  -------------------  ------------------------ 
1 | A    1 | 1 | A1   1  | 1 | 1/1/2016 
2 | B    2 | 1 | A1   2  | 1 | 1/2/2016 
3 | C    3 | 1 | A1   3  | 2 | 1/3/2016 
        4 | 2 | A1   4  | 2 | 1/4/2016 
        5 | 2 | A1   5  | 2 | 1/5/2016 
        6 | 3 | A1   6  | 2 | 1/6/2016 
        7 | 3 | A1   7  | 2 | 1/7/2016 
        8 | 3 | A1   8  | 1 | 1/8/2016 
        9 | 3 | A1   9  | 1 | 1/9/2016 

Как запросить с результатами, как ниже?

------------------------------------------------------------------------ 
PID  Project Name MID    Material Name DocID Date 
------------------------------------------------------------------------ 
1  A    1    A1    1  1/1/2016 
1  A    2    A2    2  1/2/2016 
1  A    3    A3    NULL NULL 
2  B    4    B1    3  1/3/2016 
2  B    5    B2    4  1/4/2016 
2  B    NULL   NULL   5  1/5/2016 
2  B    NULL   NULL   6  1/6/2016 
2  B    NULL   NULL   7  1/7/2016 
3  C    6    C1    8  1/8/2016 
3  C    7    C2    9  1/9/2016 
3  C    8    C3    NULL NULL 
3  C    9    C4    NULL NULL 

PID in Material and Document table - это иностранный ключ.

Я использую Microsoft SQL 2008. Возможно ли это?

+0

Adjust выборочные данные, чтобы сделать вещи немного сложнее, удалить одну или две строки из документа, и добавить еще один строка с DocId 11. – jarlh

+1

Эти '' '' '' '' '' '' '' '' '' '' '' из ниоткуда. Что именно ты пытаешься сделать? Если между таблицей нет никакой связи, невозможно сопоставить строки, период, поэтому нам нужно больше продолжать. –

+0

Не ясно, почему * результаты должны быть такими, какие они есть. Обязательно объясните это в вопросе. – user2864740

ответ

1

Вам, кажется, нужны списки в столбцах. Вы можете получить это с помощью full outer join и row_number():

select p.*, m.mid, m.name, d.docid, d.date 
from project p left join 
    (select m.*, row_number() over (partition by pid order by mid) as seqnum 
     from materials 
    ) m 
    on p.pid = m.pid full outer join 
    (select d.*, row_number() over (partition by pid order by docid) as seqnum 
     from documents 
    ) d 
    on p.pid = d.pid and m.seqnum = d.seqnum; 

Хммм, попробуйте эту версию:

select p.*, md.mid, md.name, md.docid, md.date 
from project p left join 
    (select m.id, m.name, d.docid, d.date 
     from (select m.*, row_number() over (partition by pid order by mid) as seqnum 
      from materials 
      ) m full outer join 
      (select d.*, row_number() over (partition by pid order by docid) as seqnum 
      from documents 
      ) d 
      on p.pid = d.pid and m.seqnum = d.seqnum 
    ) md 
    on p.pid = md.pid; 
+0

Если я использую ваш запрос, p.pid всегда имеет значение null, если docID строит больше, чем строки MID, и наоборот. – Slocky

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