如何不联接而是粘合或缝制SQL Server中的三个表

How to NOT JOIN but glue or sew three tables in SQL Server

我有3张桌子:

Clients表:

1
2
3
4
ID      Name
1       ClientName1
2       ClientName2
3       ClientName3

每个客户可能都有一些身份证明文件

Documents

1
2
3
4
5
6
7
8
9
ID      ClientId           Document
1       1                  ClientDocument11
2       1                  ClientDocument21
3       1                  ClientDocument31

4       2                  ClientDocument12
5       2                  ClientDocument22

6       3                  ClientDocument13

每个客户也可能有一些银行帐户

Accounts

1
2
3
4
5
6
7
8
9
ID      ClientId           Account
1       1                  110000000000

2       2                  120000000000
3       2                  220000000000

4       3                  130000000000
5       3                  230000000000
6       3                  330000000000

我不希望加入,而是将表Documents粘合或缝制到表Clients中,然后添加表Account以得到像这样的表:

1
2
3
4
5
6
7
8
9
10
11
ID      Name                Document             Account
1       ClientName1         ClientDocument11     110000000000
1       ClientName1         ClientDocument21     110000000000
1       ClientName1         ClientDocument31     110000000000

2       ClientName2         ClientDocument12     120000000000
2       ClientName2         ClientDocument22     220000000000

3       ClientName3         ClientDocument13     130000000000
3       ClientName3         ClientDocument13     230000000000
3       ClientName3         ClientDocument13     330000000000

1
2
3
4
5
6
7
8
9
10
11
ID      Name                Document             Account
1       ClientName1         ClientDocument11     110000000000
1                           ClientDocument21      
1                           ClientDocument31    

2       ClientName2         ClientDocument12     120000000000
2                           ClientDocument22     220000000000

3       ClientName3         ClientDocument13     130000000000
3                                                230000000000
3                                                330000000000

如果您使用Client2查看行,则可以理解,使用JOIN无法实现:

1
2
2       ClientName2         ClientDocument12     120000000000
2       ClientName2         ClientDocument22     220000000000

在SQL Server中是否可以?


可以用SQL完成,但是有点麻烦。主要思想是为文档和科目分配行号(每个客户从1开始),然后通过连接客户ID和行号进行完全外部联接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT c.Id, c.Name, t.Document, t.Account
FROM Clients c
JOIN (
  SELECT COALESCE(d.ClientId, a.ClientId) AS ClientId,
    COALESCE(d.Line, a.Line) AS Line,
    d.Document, a.Account
  FROM (
    SELECT ClientId, Document,
      ROW_NUMBER() OVER (partition BY ClientId ORDER BY Document) AS Line
    FROM Documents
  ) d
  FULL OUTER JOIN (
    SELECT ClientId, Account,
      ROW_NUMBER() OVER (partition BY ClientId ORDER BY Account) AS Line
    FROM Accounts
  ) a ON d.ClientId = a.ClientId AND d.Line = a.Line
) t ON c.Id = t.ClientId
ORDER BY c.Id, t.Line;

看小提琴。