2017-02-21 157 views
1

如何在具有多个值的情况下使用CASE?这里是我的查询:带条件的UPDATE CASE SQL Server

UPDATE car_availability 
SET availability_status = CASE 
          WHEN car_no = (SELECT A.car_no 
              FROM car_maintenance A 
              WHERE A.car_no = car_no 
               AND A.Start_Date = (SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))) 
           THEN 'For Maintenance' 
           ELSE 'Good' 
          END 

,我得到一个错误

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。 该声明已被终止。

car_maintenance表我有一套汽车,它是维修,而在car_availability表我有所有的汽车。我想将所有在car_maintenance之下的汽车的availability_status设置为'For Maintenance'。我怎样才能做到这一点?

我在car_availability的专栏是car_nocar_availability。或者我可以使用IF ELSE来做到这一点吗?提前致谢。

对于car_maintenance表,列

car_no, maintenance_category, start_date_of_maintenance, end_date_of_maintenance 

回答

1

您冷加工使用IN子句(而不是=)

UPDATE car_availability 
    SET availability_status = CASE WHEN car_no IN (SELECT A.car_no FROM car_maintenance A 
          WHERE A.car_no = car_no and A.Start_Date = 
          (SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))) 
     THEN 'For Maintenance' 
     ELSE 'Good' 
     END 
+0

谢谢,它正在工作。我可以在availability_status下有多个CASE吗? –

+0

你可以有几个条件,如果情况,所以你可以为availability_status分配不同的值.. – scaisEdge

2

使用join。我认为这是你想要什么:

UPDATE ca 
    SET availability_status = (CASE WHEN cm.car_no IS NOT NULL 
            THEN 'For Maintenance' 
            ELSE 'Good' 
           END) 
    FROM car_availability ca LEFT JOIN 
     car_maintenance cm 
     ON cm.car_no = ca.car_no AND 
      cm.Start_Date = CAST(GETDATE() as DATE); 
+0

我在你的方法中有一个错误'UPDATE中的FROM子句和DELETE语句不能包含子查询源或连接。'。我正在使用SQL Server 2016,这与我使用的版本有关吗? –

+0

@RobertJohnMartin。 。 。这听起来不像我的SQL Server错误。 –

0

我相信错误实际发生的,因为你的子查询返回不是一组不同的车牌号码的其他东西。不过,我不确定仅仅添加“DISTINCT”关键词就会给出适当的结果。

在这种情况下,拔出子查询并仔细查看可能会非常有帮助。仔细看这个,我看到过滤器:“WHERE A.car_no = car_no”,我不能立即理解。我试图弄清楚为什么这种过滤只会让我们在维修保养中使用汽车(我看到日期的东西......这很有道理,但不知道维修表中的内容我们不知道如何继续)。该子查询取决于维护表的确切内容。

我在想,你想为一个子查询什么是正确挑选汽车目前在维修,在car_maintenance表使用数据的表达式。您可以通过仔细考虑该表中的内容来做到这一点。如果表格中包含所有曾经维护过的车辆,那么是否有一个显示CompletionDate的字段?如果您的维护表显示维护中的开始日期和结束日期,那么您是黄金。你需要做一些面向日期的报表,但可以隔离哪些车目前正在维修。 CompletionDate = NULL的记录甚至可能是那些正在维护的汽车。同样,我们需要更多地了解car_maintenance表。

在另一方面,car_maintenance表可以被设计成它不断变化,但仅持有car_number,对于那些汽车目前在维修。

我们真的不知道,虽然。因此,请填写car_maintenance表格中的内容。我们需要更多地了解,为了帮助确保您的UPDATE查询将会导致“car_availability”的正确设置。

我倾向于认为我们可以查看子查询的代码区,为“块”,这是试图获得了汽车的列表。这不是所有的汽车,但只是一些汽车。那些目前正在维修。这样,当你自己为子查询运行你的代码时(当我这样做时,我只是在同一个SQL窗口中运行它,然后剪切并粘贴,最终删除测试代码),你可以看看它,并看到:“这是目前的一套汽车维修?”一旦你满意的代码总是只产生目前正在维修的汽车,那么放入代码应该没问题。

祝你好运。