【问题标题】:Different join/update based on case query基于案例查询的不同连接/更新
【发布时间】:2015-06-17 18:20:12
【问题描述】:

我正在尝试使用以下代码来运行基于 CASE 语句的不同 join 查询。

所以如果customer CLI 等于84422881 我希望它基于[Extenstion] 字段加入,如果不满足条件即ELSE 然后加入[Customer CLI]

use VoiceflexBilling

CASE WHEN [dbo].[MARU15_OWH07579_Calls].[CustomerCLI] = '84422881' THEN

UPDATE [dbo].[MARU15_OWH07579_Calls] 
SET [dbo].[MARU15_OWH07579_Calls].[CustomerLookup] = CLIMapping.[customer id] 
FROM [BillingReferenceData].[dbo].[CLIMapping] 
INNER JOIN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] 
on [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[Extension] = [BillingReferenceData].[dbo].[CLIMapping].[CLI]

ELSE

UPDATE [dbo].[MARU15_OWH07579_Calls] 
SET [dbo].[MARU15_OWH07579_Calls].[CustomerLookup] = CLIMapping.[customer id] 
FROM [BillingReferenceData].[dbo].[CLIMapping] 
INNER JOIN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] 
on [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[CustomerCLI] = [BillingReferenceData].[dbo].[CLIMapping].[CLI]

END

目前我收到以下错误:

Msg 156, Level 15, State 1, Line 3 关键字附近的语法错误 '案子'。消息 156,级别 15,状态 1,第 11 行 关键字“其他”。消息 102,级别 15,状态 1,第 19 行语法不正确 'END'附近。

任何人都可以帮助使用正确的语法吗?

谢谢,

【问题讨论】:

    标签: sql sql-server join sql-update case


    【解决方案1】:

    您的查询中有一些 cmets。首先,case 是一个表达式,而不是控制流。所以,它属于一个查询。其次,您可以对此查询使用“常规”逻辑。第三,表别名将使查询更易于编写和阅读:

    UPDATE c 
    SET c.[CustomerLookup] = CLIMapping.[customer id] 
    FROM [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] cm
         [BillingReferenceData].[dbo].[CLIMapping] c INNER JOIN
         on (c.[CustomerCLI] = '84422881' AND c.[Extension] = cm.[CLI]) or
            (c.[CustomerCLI] <> '84422881' AND c.[CustomerCLI] = cm.[CLI])
    

    【讨论】:

      【解决方案2】:

      您可以在join condition 中使用case 语句:

      UPDATE [dbo].[MARU15_OWH07579_Calls] 
      SET [dbo].[MARU15_OWH07579_Calls].[CustomerLookup] = CLIMapping.[customer id] 
      FROM [BillingReferenceData].[dbo].[CLIMapping] 
      INNER JOIN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] 
      ON [BillingReferenceData].[dbo].[CLIMapping].[CLI] = 
       CASE WHEN [dbo].[MARU15_OWH07579_Calls].[CustomerCLI] = '84422881' 
                       THEN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[Extension]
            ELSE [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[CustomerCLI] 
       END
      

      【讨论】:

        【解决方案3】:

        案例必须出现在查询中。对于您的场景,我建议您编写代码如下:(您需要实现循环以遍历所有记录,在这种情况下,您需要稍微修改此代码)

        DECLARE @p varchar(100)
        SET @p=(SELECT TOP 1 [dbo].[MARU15_OWH07579_Calls].[CustomerCLI] FROM [dbo].[MARU15_OWH07579_Calls])
        IF @p = '84422881'
           UPDATE [dbo].[MARU15_OWH07579_Calls] 
           SET [dbo].[MARU15_OWH07579_Calls].[CustomerLookup] = CLIMapping.[customer id] 
           FROM [BillingReferenceData].[dbo].[CLIMapping] 
           INNER JOIN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] 
           on [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[Extension] =[BillingReferenceData].[dbo].[CLIMapping].[CLI]
        
        ELSE
           UPDATE [dbo].[MARU15_OWH07579_Calls] 
           SET [dbo].[MARU15_OWH07579_Calls].[CustomerLookup] = CLIMapping.[customer id] 
           FROM [BillingReferenceData].[dbo].[CLIMapping] 
           INNER JOIN [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls] 
           on [VoiceflexBilling].[dbo].[MARU15_OWH07579_Calls].[CustomerCLI] = [BillingReferenceData].[dbo].[CLIMapping].[CLI]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-17
          • 2012-07-27
          • 1970-01-01
          • 2015-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多