How to NOT JOIN but glue or sew three tables in SQL Server
我有3张桌子:
1 2 3 4 | ID Name 1 ClientName1 2 ClientName2 3 ClientName3 |
每个客户可能都有一些身份证明文件
表
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 |
每个客户也可能有一些银行帐户
表
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 |
我不希望加入,而是将表
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; |
看小提琴。