【问题标题】:Left outer join multiple selects左外连接多选
【发布时间】:2018-04-20 18:51:14
【问题描述】:

我有以下 sql 语句,这正是它应该做的:

select    C.Company_RecID, C.Contact_RecID, C.First_Name, C.Last_Name,
          C.Title, C.Inactive_Flag, e.Description
FROM            dbo.Contact AS C 
LEFT OUTER JOIN dbo.Contact_Communication AS e ON C.Contact_RecID = e.Contact_RecID 
                                AND e.Communication_Type_RecID = 1 AND e.Default_Flag = 1

但是,在dbo.contact_communication 中,description 字段的含义取决于communication_type_recID。如果是1,描述是一个电子邮件地址。 4是手机号码,2是直拨号码,14是个人手机号码。

我想更改查询以返回三个额外的列。如果此联系人的记录为 4,则第 8 列将是描述的值,如果此联系人的记录为 2,则第 9 列是描述的值,如果有值,则第 10 列14 个。

【问题讨论】:

  • 您可以使用条件聚合来做到这一点。

标签: sql sql-server tsql select


【解决方案1】:

这样的东西应该非常接近,因为我了解您在寻找什么。

select C.Company_RecID
    , C.Contact_RecID
    , C.First_Name
    , C.Last_Name
    , C.Title
    , C.Inactive_Flag
    , e.Description
    , EmailAddress = MAX(case when communication_type_recID = 1 then e.Description end)
    , CellPhone = MAX(case when communication_type_recID = 4 then e.Description end)
    , DirectNumber = MAX(case when communication_type_recID = 2 then e.Description end)
    , PersonalCellPhone = MAX(case when communication_type_recID = 14 then e.Description end)
FROM dbo.Contact AS C 
LEFT OUTER JOIN dbo.Contact_Communication AS e ON C.Contact_RecID = e.Contact_RecID 
                                        AND e.Communication_Type_RecID IN (1,2,4,14) 
                                        AND e.Default_Flag = 1
group by C.Company_RecID
    , C.Contact_RecID
    , C.First_Name
    , C.Last_Name
    , C.Title
    , C.Inactive_Flag
    , e.Description

【讨论】:

  • 更接近,但这会为一次点击返回多条记录。 Company_RecID Contact_RecID First_Name Last_Name Title Inactive_Flag 描述 EmailAddress CellPhone DirectNumber PersonalCellPhone 2543 7428 D G NULL 0 4099995675 NULL NULL 4099995675 NULL 2543 7428 D G NULL 0 D@company.com Davxne@sxers.com NULL NULL NULL
  • 好吧,我主要是在猜测,因为我们没有实际的表格或数据可供使用。如果您可以发布 ddl 和数据,我将很乐意更新此内容。这是一个很好的解释。 spaghettidba.com/2015/04/24/…
  • 如果一个联系人可以有多个contact_Communication,你想返回多少行?您的线路是实时联系人,您应该从组中删除 e.Description
  • 我相信通过从 select 和 group by 中删除 e.description ,这可能会产生预期的结果。很快就会更新。
  • 这是有道理的。不确定您是否需要在输出中使用它,但这是有道理的.....duh....对此感到抱歉。
【解决方案2】:

我认为 UNION 可能会帮助您。 (https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-union-transact-sql?view=sql-server-2017)

你可以试试这样的:

select col_1, 'something' as A, '' as B from TableA
union
select col_2, '' as A, 'something' as B from TableA

col_1 和 col_2 是表中的实际列,而 A 和 B 是这些额外信息的别名。

【讨论】:

    【解决方案3】:

    没有聚合

    select C.Company_RecID
         , C.Contact_RecID
         , C.First_Name
         , C.Last_Name
         , C.Title
         , C.Inactive_Flag
         , e.Description
         , e1.Description  as EmailAddress
         , e2.Description  as CellPhone
         , e4.Description  as DirectNumber
         , e14.Description as PersonalCellPhone 
      FROM dbo.Contact AS C 
      LEFT OUTER JOIN dbo.Contact_Communication AS e1 
        ON e1.Contact_RecID = C.Contact_RecID   
       AND e1.Communication_Type_RecID = 1 
       AND e1.Default_Flag = 1
     LEFT OUTER JOIN dbo.Contact_Communication AS e2 
        ON e2.Contact_RecID = C.Contact_RecID   
       AND e2.Communication_Type_RecID = 2
       AND e2.Default_Flag = 1
      LEFT OUTER JOIN dbo.Contact_Communication AS e4 
        ON e4.Contact_RecID = C.Contact_RecID   
       AND e4.Communication_Type_RecID = 4 
       AND e4.Default_Flag = 1
      LEFT OUTER JOIN dbo.Contact_Communication AS e14 
        ON e14.Contact_RecID = C.Contact_RecID   
       AND e14.Communication_Type_RecID = 14  
       AND e14.Default_Flag = 1
    

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2011-10-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多