【问题标题】:Transact SQL Returning Data based on foreign key基于外键处理 SQL 返回数据
【发布时间】:2014-07-07 18:15:13
【问题描述】:

有一个表 A,它有两列,每列都是其他表的外键,可以存储关键数据。需要根据这些列拉回关键数据,例如名称。可以对每个表进行左连接,但这将包含很多空值,所以要避免这种情况。外键没有使用空值,因为每个值都可能存在一个键 - 但我们不以这种方式使用系统,因此一个字段的值为零。

例子:

A:

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

App

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

Ten

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

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:
    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 会选择第一个值,如果第一个值为空,它会选择第二个值

    【讨论】:

    • 谢谢你,这正是我所需要的
    【解决方案2】:
    select a.[index], a.App, 0 as [Ten], App.Lname 
      from a 
      join App 
        on a.App = App.[Index] 
     where a.App <> 0
    intersect 
    select a.[index], 0 as [App], a.Ten, Ten.Lname 
      from a 
      join Ten
        on a.Ten = Ten.[Index] 
     where a.Ten <> 0
     order by 1
    

    从 App 中获取值,然后将它们与 Ten 相交
    忽略0值

    【讨论】:

    • 我试过了,但我得到了这个错误消息。 A severe error occurred on the current command. The results, if any, should be discarded. 以前从未见过,但这很有趣。从进一步研究来看,它似乎是一个索引问题
    • 虽然这可能有效,但请提供一些关于它的作用的解释,因为 SO 不是您获得解决方案并离开的站点。它应该是一个学习东西的地方。目前,您的答案很容易出现 Deletjolnir。
    • @LordZsolt 这是使用问题名称的完整语法。 SO 不是您重复 MSDN 文档的站点。文档中对语法的每一点都进行了详尽的介绍。
    • @Blam 好吧,我只是告诉你,因为你的问题被标记为Low Quality Post。我来自评论,而不是浏览 SO。
    • 尝试在 [reserved] 单词周围使用方括号,例如 [index]
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2023-03-09
    • 2013-11-22
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多