如何在具有多个值的情况下使用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_no
和car_availability
。或者我可以使用IF ELSE吗?提前谢谢。
对于car_maintenance
表,列是
car_no, maintenance_category, start_date_of_maintenance, end_date_of_maintenance
答案 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窗口中运行它,然后剪切并粘贴,最终删除测试代码),您可以查看它,并看到:“这是目前维修中的汽车吗?”一旦你满意,代码总是只产生那些当前处于维护状态的汽车,那么放入代码就可以了。
祝你好运。