如何在SQL Server中不连接而是粘合或缝合三个表
我有三张桌子:如何在SQL Server中不连接而是粘合或缝合三个表,sql,sql-server,select,join,Sql,Sql Server,Select,Join,我有三张桌子: 客户端表: ID Name 1 ClientName1 2 ClientName2 3 ClientName3 每个客户可能都有一些身份证明文件 表文件: ID ClientId Document 1 1 ClientDocument11 2 1 ClientDocument21 3 1
客户端
表:
ID Name
1 ClientName1
2 ClientName2
3 ClientName3
每个客户可能都有一些身份证明文件
表文件:
ID ClientId Document
1 1 ClientDocument11
2 1 ClientDocument21
3 1 ClientDocument31
4 2 ClientDocument12
5 2 ClientDocument22
6 3 ClientDocument13
ID ClientId Account
1 1 110000000000
2 2 120000000000
3 2 220000000000
4 3 130000000000
5 3 230000000000
6 3 330000000000
此外,每个客户可能都有一些银行账户
表科目
:
ID ClientId Document
1 1 ClientDocument11
2 1 ClientDocument21
3 1 ClientDocument31
4 2 ClientDocument12
5 2 ClientDocument22
6 3 ClientDocument13
ID ClientId Account
1 1 110000000000
2 2 120000000000
3 2 220000000000
4 3 130000000000
5 3 230000000000
6 3 330000000000
我不想加入,而是将表文档
粘贴或缝合到表客户
中,然后添加表帐户
以获得如下表:
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
或
如果查看带有Client2的行,您就会明白这无法通过JOIN实现:
2 ClientName2 ClientDocument12 120000000000
2 ClientName2 ClientDocument22 220000000000
在SQL Server中是否可行?可以用SQL完成,但有点痛苦。其主要思想是为文档和帐户分配行号(每个客户端从1开始),然后通过连接客户端ID和行号进行完整的外部连接:
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;
请参阅。不使用联接不可能更改帐户表和插入记录,还是仅使用结果集?无论您喜欢与否,您需要的都称为联接。它的显示方式取决于用户界面。不是这样的,您无法通过使用Client2的JOIN Look rows获得这样的表。您最好将其留给表示层。它将比sql更简单,性能更好。FULL JOIN
可以很好地工作,但是如果您有2-3个以上的表要以这种方式连接,它很快就会变得丑陋和缓慢。你可能会发现我对一个类似问题的回答很有用:谢谢,科多和弗拉基米尔·巴拉诺夫!