具有条件

时间:2017-02-21 20:38:56

标签: sql sql-server sql-server-2008

如何在具有多个值的情况下使用CASE?这是我的疑问:

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

我收到错误

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。   声明已经终止。

car_maintenance表中,我有一组汽车用于维护,而在car_availability表中,我有所有汽车。我想将availability_status下的所有汽车的car_maintenance设置为“For Maintenance”。我怎样才能做到这一点?

car_availability中的我的列是car_nocar_availability。或者我可以使用IF ELSE吗?提前谢谢。

对于car_maintenance表,列是

 car_no, maintenance_category, start_date_of_maintenance, end_date_of_maintenance

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分:0)

我认为错误确实发生了,因为您的Sub Query正在返回除DISTINCT车号之外的其他内容。不过,我不确定只添加“DISTINCT”关键词会在这里给出正确的结果。

在这种情况下,拔出子查询并仔细查看它会非常有帮助。快速浏览一下,我看到过滤器:“WHERE A.car_no = car_no”,我不明白。我正在试图解释为什么过滤现在只给我们维修汽车(我看到日期的东西......这是有意义的,但不知道维护表中的内容我们真的不知道如何继续)。此子查询取决于维护表的确切内容。

我认为你想要的Sub查询是一个表达式,它使用car_maintenance表中的数据正确地选择目前处于维护状态的汽车。您可以通过仔细考虑该表中的内容来完成此操作。如果该表包括所有曾经维护的汽车,那么,是否有一个显示CompletionDate的字段?如果您的维护表显示维护期间的开始和结束日期,那么您就是金牌。您需要执行一些面向日期的语句,但可以隔离当前正在维护的汽车。甚至可能任何具有CompletionDate = NULL的记录都是维护中的汽车。同样,我们需要了解更多关于car_maintenance表的信息。

另一方面,car_maintenance表可能被设计为不断更改,但只保留car_number,用于那些当前正在维护的汽车。

但是,我们并不是真的知道这一点。所以,请填写car_maintenance表中的内容。我们需要了解更多信息,以帮助确保您的UPDATE查询将导致正确的“car_availability”设置。

我倾向于认为我们可以查看Sub Query的代码区域,作为试图产生汽车列表的“块”。这不是所有的汽车,而只是一些汽车。那些目前正在维护的人。这样,当您自己运行Sub Query的代码时(当我执行此类操作时,我只是在同一个SQL窗口中运行它,然后剪切并粘贴,最终删除测试代码),您可以查看它,并看到:“这是目前维修中的汽车吗?”一旦你满意,代码总是只产生那些当前处于维护状态的汽车,那么放入代码就可以了。

祝你好运。