包含涉及另一个表的Case的SQL Server Update

时间:2012-12-14 20:02:50

标签: sql sql-server

我有2张桌子。一个有订单元素(OE),一个有项目信息(PO)。 1个项目有很多订单元素。设置表的方式,项目日期在PO中,而货币在OE中。我需要更新OE表中的欧元汇率。我正在尝试做这样的事情

    UPDATE [OETest]
    SET [Euro Exchange Rate] = {
    CASE
        WHEN (DATEPART(month, PO.[Project Date Time]) = January)
        THEN 8.143296
        WHEN (DATEPART(month, PO.[Project Date Time]) = February)
        THEN 8.340111
    }
    FROM [POTest] PO, [OETest] OE       
    WHERE OE.[Currency] = 'YUAN'

但我迷路了(这是我尝试过的众多疑问之一)。任何人都可以帮我构建必要的查询,并告诉我为什么它的工作原理?

此特定查询告诉我关键字CASE

附近的语法不正确

为了更清楚地说明我想要实现的目标:我在OE表中有一个欧元汇率列。我有从网站(不在表格中)获得的平均每月汇率。我想根据项目月份和货币设置此汇率列。我将在单独的查询中处理每种货币,因此人民币是我担心此查询的唯一货币。月份在PO表中。我需要在case语句中使用PO表中的月份。

2 个答案:

答案 0 :(得分:4)

UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] = 8.143296
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents January this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120201'

如果您根据不同的日期需要不同的值,则只需要一个案例陈述

UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] =
       CASE Month(PO.[Project Date Time])
            when 1 then 8.143296
            when 2 then 7.143296
            when 3 then 7.743296
            END
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents 3 months this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120401'

答案 1 :(得分:0)

究竟是什么问题?

我可以看到查询的许多问题。你得到的SQL错误是什么?

无论如何,如果我想尝试按照我的想法做同样的事情,我会这样做:

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO)      
WHERE OE.[Currency] = 'YUAN'

我在这里要做的是在SET块之后选择我想要的结果。在CASE语句中,我添加了一个else,因为我没有从日期部分得到结果。

WHERE部分应该是UPDATE子句的WHERE条件,因为您需要告诉它要更新哪些记录,除非您想要更新该OETest表中的所有记录。

总而言之,你在说

当“项目日期时间”字段的月份部分等于1月时,使用POTest表中的值更新“欧元汇率”字段,并更新OETest表中“货币”值为“YUAN”的记录。

请注意,您可能需要在SELECT语句中使用WHERE子句,因为它可能会返回多个记录,并且您只需要一个命令来获取“项目日期时间”字段。猜测,你可能想要添加一个where语句,如下所示:

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO WHERE PO.ProjectID = 100)      
WHERE OE.[Currency] = 'YUAN'

如果有帮助,请告诉我。

此致 JT