【问题标题】:SQL join Case Results with Data from SelectSQL 将案例结果与 Select 中的数据连接起来
【发布时间】:2016-08-08 18:52:39
【问题描述】:

我想要完成的是让案例的结果包含数据的结果。我的案例是 1 和 2,它们进入一个表格,导致 2 列 ID |状态 |状态描述。我想将数据的结果与 CASE 的结果一起加入。

我有一个用于结果的表和 2 个在案例中加入的表。

@ZipCode    varchar(5),
@Tribal     varchar(5)

as

DECLARE @Status varchar(30)
SELECT @Status = CASE
when exists (SELECT ZipCodeCoverage.ZipCode, ZipCodeCoverage.State, ServicePlan, plan_name
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]= [plan_state]

where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y')   then '1' 
ELSE 2
 END
Select * FROM [LifelineReference].[dbo].[LifelinePlanStatusCodes]
    where ID = @Status

状态码表

ID |   STATUS     | StatusDescription
1  |   Success    | Transaction May Proceed
2  |   FAIL       | Do not continue

我需要我的结果是什么

ID |  STATUS | StatusDescription | ZipCode | State |  ServicePlan | plan_name

【问题讨论】:

  • 通过您在此处提出问题的方式,您似乎并没有完全理解案例陈述是什么。 case 语句有点像 if...您可以在 select 语句中使用它。类似于:从表中选择字段(您的案例陈述)
  • 话虽如此,您能否推荐一个替代解决方案来解决我可能想尝试的问题?

标签: sql sql-server join case union


【解决方案1】:

我想我明白了。这是我想出的

@ZipCode    varchar(5),
@Tribal     varchar(5)

as

DECLARE @Status varchar(30)

 SELECT @Status = CASE
when exists (SELECT ZipCodeCoverage.ZipCode, ZipCodeCoverage.State, ServicePlan, plan_name
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]=[plan_state]
       where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y')  then '1' 
 ELSE 2
 end


 Select *
 ,(SELECT ZipCodeCoverage.ZipCode  
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]=[plan_state]
       where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y') as ZipCode
 ,(SELECT ZipCodeCoverage.State 
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]=[plan_state]
       where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y') as State
    ,(SELECT ServicePlan 
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]=[plan_state]
       where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y') as ServicePlan
  ,(SELECT plan_name
 FROM [LifelineReference].[dbo].[ZipCodeCoverage]
    JOIN [VcareData].[dbo].[tbl_plan] ON [ZipCodeCoverage].[State]=[plan_state]
       where ZipCode = @ZipCode and is_tribal = @Tribal and life_line = 'Y') as plan_name
FROM [LifelineReference].[dbo].[LifelinePlanStatusCodes]
    where ID = @Status

给我结果:

 ID Status  StatusDescription   ZipCode State   ServicePlan plan_name
  1 SUCCESS Service is Available    48322   MI  ABC Michigan Wireless XXXX Service Free250

【讨论】:

    【解决方案2】:

    这是当 1 时只有第一行应该显示的结果。当 2 a failed 应该显示没有其他信息.. 当 2 NO 数据全部显示出来时.. 几乎就好像结果是在 case 之后运行的......

    ID  Status  StatusDescription   ZipCode State   ServicePlan plan_name
    1   SUCCESS Service is Available    48322   MI  ARV15   Michigan Wireless Lifeline Service Free250
    2   FAILED  NO Service Available in this Area   48322   MI  ARV15   MI PAY AS YOU GO
    2   FAILED  NO Service Available in this Area   48322   MI  ARV15   MI Non Lifeline UNLIMITED TALK & TEXT
    2   FAILED  NO Service Available in this Area   48322   MI  ARV15   MI Non Lifeline 250 TALK OR 500 TEXT 30 DAYS
    

    【讨论】:

      【解决方案3】:

      这是一种更简洁的解决方案,它不会重复相同的 SQL 语句,而是在一个查询中执行。不完全理解所涉及的表的字段、它们的数据和它们的关系有点困难。我假设 ZipCodeCoverage 将邮政编码与州相关联,is_tribal 和 life_line 等字段是 tbl_plan 的一部分,并且 LifelinePlanStatusCodes 中存在状态 2 记录。

      更新

      以下解决方案使用公用表表达式 (CTE),以便不会重复查询。但是,在更好地了解您要查找的内容之后,使用 if exists (...) 可能会更清楚,选择您想要的结果,否则选择 FAIL 记录。这重复了部分查询一次,但意图也很明确。或者,我不知道您是如何使用结果的,但我倾向于处理调用应用程序中的失败条件——只返回成功记录(使用第一个查询),如果没有返回记录,则将其视为失败。

      在任何情况下,CTE 解决方案都会在 FoundPlan_CTE 中获取您的计划并加入状态代码,但如果 FoundPlan_CTE 返回任何记录,则选择的状态代码为 1(成功),如果 FoundPlan_CTE 未返回任何记录,则选择的状态代码为 2(失败) .

      with FoundPlan_CTE (ZipCode, State, ServicePlan, plan_name)
      as
      (
          select
              z.ZipCode
              ,z.State
              ,p.ServicePlan
              ,p.plan_name
          from
              [LifelineReference].[dbo].[ZipCodeCoverage] z
              inner join [VcareData].[dbo].[tbl_plan] p on p.plan_state = z.State
          where
              z.ZipCode = @ZipCode
              and p.is_tribal = @Tribal
              and p.life_line = 'Y'
      )
      select
          s.ID
          ,s.Status
          ,s.StatusDescription
          ,p.ZipCode
          ,p.State
          ,p.ServicePlan
          ,p.plan_name
      from
          [LifelineReference].[dbo].[LifelinePlanStatusCodes] s
          left outer join FoundPlan_CTE p on 1 = 1
      where
          s.ID = isnull((select top 1 1 from FoundPlan_CTE),2)
      

      【讨论】:

      • 试过了,干净多了,但是返回的值返回的是所有数据,而不是特定的行 ID 状态 StatusDescription ZipCode State ServicePlan plan_name 1 SUCCESS Service is Available 48322 MI ARV15 Michigan Wireless Lifeline Service Free250 2 FAILED此区域无服务 48322 MI ARV15 MI PAY AS YOU GO 2 失败 此区域无服务 48322 MI ARV15 MI Non Lifeline UNLIMITED TALK & TEXT 2 失败 此区域无服务 48322 MI ARV15 MI Non Lifeline 250 TALK 或 500文本 30 天
      • 这相当于只有 life_line = 'Y' 记录。我编辑了我的答案以反映这一点。鉴于此,您也可以摆脱 case 语句并加入 s.ID = 1 或 s.Status = 'SUCCESS',但我留下了 case 语句以确保您的原始含义清晰;你可能希望改变它。
      • 这解决了成功并且看起来不错,但仍然需要失败的出现在其他地方。仍然没有数据显示。
      • 对不起,我误解了你的初衷。进行了最后一次更新——不是对它或一般方法感到疯狂——但希望它对你有用。
      猜你喜欢
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2017-06-22
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多