繁体   English   中英

连接两个或两个以上没有公共字段的表

[英]Join two or more tables that have no common fields

我在数据库中有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 SQL2008。可以吗?

您似乎想要在列中列出。 您可以使用full outer join row_number()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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM