Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 基于外键返回数据的Transact-SQL_Sql Server_Tsql - Fatal编程技术网

Sql server 基于外键返回数据的Transact-SQL

Sql server 基于外键返回数据的Transact-SQL,sql-server,tsql,Sql Server,Tsql,有一个表a,该表有两列,每列都是可以存储键数据的其他表的外键。需要根据这些列提取关键数据,例如名称。可以对每个表进行左连接,但这将包含大量空值,因此希望避免这种情况。外键不使用空值,因为每个值可能都存在一个键-但我们不这样使用系统,因此一个字段的值为零,另一个字段的值为零 例如: 表A: Index App Ten ---------------- 1 123 0 2 124 0 3 0 125 4 0 126

有一个表a,该表有两列,每列都是可以存储键数据的其他表的外键。需要根据这些列提取关键数据,例如名称。可以对每个表进行左连接,但这将包含大量空值,因此希望避免这种情况。外键不使用空值,因为每个值可能都存在一个键-但我们不这样使用系统,因此一个字段的值为零,另一个字段的值为零

例如:

A

Index  App   Ten
----------------
  1     123    0
  2     124    0
  3      0     125
  4      0     126
App

Index  LName
---------------
 123     Jones
 124     Smith
10

Index   Lname
---------------
 125      Doe
 126      Williams
什么是正确的方法来连接这些表以基于索引选择表(如果为零则忽略),并返回所需的数据,而不使用左连接和空值

期望输出:

Index  App   Ten  Lname
------------------------------
  1     123    0    Jones
  2     124    0    Smith
  3      0     125  Doe
  4      0     126  Williams
选择一个[index],一个.App,0作为[Ten],App.Lname
从
加入应用程序
在a.App=App。[索引]
其中a.应用程序0
横断
选择[index],0作为[App],a.Ten,Ten.Lname
从
加入十个
a.十=十。[索引]
a.10.0在哪里
按1订购
从应用程序中获取值,然后将其与10相交
忽略0个选项

选择一个[index],一个.App,0为[Ten],App.Lname
Select A.Ind, A.App, A.Ten, coalesce(ap.LName,t.LName) 
from A 
LEFT JOIN App ap on ap.Ind = A.App 
LEFT JOIN Ten t on A.Ten = t.Ind
从 加入应用程序 在a.App=App。[索引] 其中a.应用程序0 横断 选择[index],0作为[App],a.Ten,Ten.Lname 从 加入十个 a.十=十。[索引] a.10.0在哪里 按1订购
从应用程序中获取值,然后将其与10相交
忽略0 vlues

Select A.Ind, A.App, A.Ten, coalesce(ap.LName,t.LName) 
from A 
LEFT JOIN App ap on ap.Ind = A.App 
LEFT JOIN Ten t on A.Ten = t.Ind
Coalesce将选择第一个值,如果第一个值为null,它将选择第二个值


Coalesce将选择第一个值,如果第一个值为空,它将选择第二个值

谢谢你这就是我需要的谢谢你这就是我需要的我尝试了这个,我得到了这个错误消息<代码>当前命令发生严重错误。如果有结果,应该丢弃。以前从未见过,但很有趣。进一步来看,这似乎是一个索引问题。虽然这可能有效,但请提供一些解释,说明它的作用,因为它不是一个你得到解决方案并离开的网站。它应该是一个学习的地方。目前,您的答案倾向于Deletjolnir@LordZsolt,这是使用问题名称的完整语法。因此,不是重复MSDN文档的站点。文档中对语法的每一点都进行了详细的介绍。@bum好吧,我只是告诉你,因为你的问题被标记为
低质量帖子
。我是从评论中来的,不是从浏览SO来的。试着在[reserved]字周围用方括号括起来,比如[index]我试过这个,我得到了这个错误消息<代码>当前命令发生严重错误。如果有结果,应该丢弃。以前从未见过,但很有趣。进一步来看,这似乎是一个索引问题。虽然这可能有效,但请提供一些解释,说明它的作用,因为它不是一个你得到解决方案并离开的网站。它应该是一个学习的地方。目前,您的答案倾向于Deletjolnir@LordZsolt,这是使用问题名称的完整语法。因此,不是重复MSDN文档的站点。文档中对语法的每一点都进行了详细的介绍。@bum好吧,我只是告诉你,因为你的问题被标记为
低质量帖子
。我是从评论中来的,不是浏览SO来的。试着在[保留]字周围[使用]方括号,比如[索引]