2016-06-22 92 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的材料和文件表外键。

我正在使用Microsoft SQL 2008. 可能吗?

+0

调整采样数据,以使事情有点棘手,从文件中删除一个或两行,并添加另一个与DocId 11行。 – jarlh

+1

那些'姓名'和'日期'来自无处。你究竟想要做什么?如果表格之间没有关系,则无法关联行和句点,所以我们需要继续。 –

+0

这是不明显的*为什么*结果应该是他们是。请务必在问题中解释这一点。 – user2864740

回答

1

您似乎想要列中的列表。您可以使用full outer joinrow_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

如果我使用你的查询,如果docID行多于MID行,则p.pid总是null,反之亦然。 – Slocky