【问题标题】:SQL server inner join not returning DescriptionSQL Server 内部联接未返回说明
【发布时间】:2018-01-24 01:10:31
【问题描述】:

寻求一些帮助,试图从我的销售点数据库中获取一些信息。它是一个 MS Sql 13.0.4001.0 数据库

我有两张桌子。一个“stock”表和一个“stock UDF”表。它们看起来有点像这样:

我们将 Stock 表称为“ST”,将 Stock UDF 表称为“SU”

库存表有以下列

SKU, Description, UDF1 ID, UDF2 ID,UDF3 ID,UDF4 ID

Stock UDF 表具有以下列

ID, Description

我想创建一个返回记录的查询,但我想从 SU 表中获取描述,而不是 UDF1 ID 列下的 ID。

ST 中的示例记录当前如下所示

SKU, Description, UDF1 ID, UDF2 ID,UDF3 ID,UDF4 ID
1000   Orange        2         1     3       Null

SU 表如下所示

ID, Description
1   Fruit
2   Salads
3   Desserts
4   Vegetables
5   Raw
6   Cooked 

我想创建一个返回以下内容的查询

 SKU   Description   UDF1     UDF2    UDF3    UDF4
1000    Oranges     Salads   Fruit  Desserts 

不确定如何正确进行内部连接。

类似这样的:

select st.SKU, st.Description, st.[UDF1 Id], st.[UDF2 Id], st.[UDF3 Id], st.[UDF4 Id]
from [Stock] as st inner join [Stock UDF] as su on st.UDF1 ID = su.ID

但没有返回我想要的。

提前致谢。

【问题讨论】:

    标签: sql sql-server tsql inner-join


    【解决方案1】:

    您只需要多次加入带有描述的表,如下所示。连接是隐含的INNER JOIN,所以除非你愿意,否则没有必要声明。但是请注意,在这种情况下,您必须使用 LEFT OUTER 连接类型,否则如果连接表中没有匹配项,您将不会返回任何行。

    编辑

    我添加了COALESCE() 函数,以便在su.Decription 字段返回NULL 的情况下,查询实际上会输出一个空字符串而不是NULLCOALESCE() 是一个方便的函数,它返回其参数集中的第一个非空值。

    SELECT st.SKU
           ,st.Description
           ,COALESCE(su1.Description, '') [UDF1 Desc]
           ,COALESCE(su2.Description, '') [UDF2 Desc]
           ,COALESCE(su3.Description, '') [UDF3 Desc]
           ,COALESCE(su4.Description, '') [UDF4 Desc]
    FROM Stock st
        LEFT JOIN [Stock UDF] su1 ON st.UDF1 = su1.ID
        LEFT JOIN [Stock UDF] su2 ON st.UDF2 = su2.ID
        LEFT JOIN [Stock UDF] su3 ON st.UDF3 = su3.ID
        LEFT JOIN [Stock UDF] su4 ON st.UDF4 = su4.ID
    

    【讨论】:

      【解决方案2】:

      即使记录丢失,您也需要使用左连接,因为您需要股票描述。指定join或inner join意味着记录/字段不能为null并返回。

      select
          st.SKU, st.Description,
          st.[UDF1 Id], ISNULL(su1.Description,''),
          st.[UDF2 Id], ISNULL(su2.Description,''),
          st.[UDF3 Id], ISNULL(su3.Description,''),
          st.[UDF4 Id], ISNULL(su4.Description,'')
      from [Stock] as st
      LEFT join [Stock UDF] as su1 on st.[UDF1 Id] = su1.ID
      LEFT join [Stock UDF] as su2 on st.[UDF2 Id] = su2.ID
      LEFT join [Stock UDF] as su3 on st.[UDF3 Id] = su3.ID
      LEFT join [Stock UDF] as su4 on st.[UDF4 Id] = su4.ID
      

      【讨论】:

        【解决方案3】:

        由于[Stock]表(UDF1 ID, UDF2 ID,UDF3 ID,UDF4 ID)有4个外键,需要加入[Stock UDF]表4次。

        left join [Stock UDF] as su1 on st.UDF1 ID = su1.ID
        left join [Stock UDF] as su2 on st.UDF2 ID = su2.ID
        left join [Stock UDF] as su3 on st.UDF3 ID = su3.ID
        left join [Stock UDF] as su4 on st.UDF4 ID = su4.ID
        

        由于存在空值,请考虑使用LEFT JOIN 而不是INNER JOIN

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-28
          • 2017-01-01
          • 2014-07-10
          • 1970-01-01
          • 1970-01-01
          • 2021-08-22
          • 2018-10-29
          相关资源
          最近更新 更多