Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中不连接而是粘合或缝合三个表_Sql_Sql Server_Select_Join - Fatal编程技术网

如何在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个以上的表要以这种方式连接,它很快就会变得丑陋和缓慢。你可能会发现我对一个类似问题的回答很有用:谢谢,科多和弗拉基米尔·巴拉诺夫!