2017-02-21 1 views
1

여러 값을 가진 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 

난 하위 쿼리는 1 개 이상의 값을 반환 오류

을 얻고있다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다. 명세서가 종료되었습니다.

car_maintenance 테이블에서 나는 car_availability 표에 나는 모든 자동차를하면서 유지 보수를위한 자동차의 세트가있다. 나는 car_maintenance 아래에있는 모든 차량의 availability_status을 '유지 관리'와 동일하게 설정하려고합니다. 어떻게해야합니까?

내 열 car_availabilitycar_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 절에있는 FROM 절에 하위 쿼리 소스 또는 조인을 포함 할 수 없습니다. '오류가 발생했습니다. SQL Server 2016을 사용하고 있는데 어떤 버전을 사용하고 있느냐가 중요합니까? –

+0

@RobertJohnMartin. . . SQL Server 오류라고 생각하지 않습니다. –

0

나는 당신의 하위 쿼리 자동차 번호의 DISTINCT 세트가 아닌 다른 뭔가를 반환하기 때문에 오류가 실제로 발생 믿습니다. 그래도 "DISTINCT"키워드를 단순히 추가하면 올바른 결과를 얻을 수 있을지 확실하지 않습니다.

이 경우 Subquery를 꺼내어주의 깊게 살펴 보는 것이 좋습니다. 빨리 이것에보기, 나는 여과기를 본다 : "WHERE A.car_no = car_no", 나는 즉시 이해하지 않는다. 저는 왜 그 필터링이 우리에게 지금은 유지 보수에있는 유일한 차를 줄 것인지를 생각하려고합니다. (저는 날짜 정보를 보았습니다. 이것은 유지 관리 테이블에 무엇이 있는지를 모르는 상태에서 진행 방법을 알지 못합니다.) 이 하위 쿼리는 유지 관리 테이블의 정확한 내용에 따라 다릅니다.

Sub 쿼리에 대해 원하는 것은 car_maintenance 테이블의 데이터를 사용하여 현재 유지 관리중인 자동차를 올바르게 선택하는 표현식이라고 생각합니다. 이 테이블에 무엇이 있는지주의 깊게 고려하여이 작업을 수행 할 수 있습니다. 테이블에 유지 보수가 완료된 차량이 모두 포함되어 있으면 CompletionDate를 표시하는 필드가 있습니까? 유지 관리 테이블에 유지 관리 기간의 시작일과 종료일이 모두 표시된 경우 황금색입니다. 날짜 중심의 진술을해야하지만 현재 유지 보수중인 차량을 분리 할 수 ​​있습니다. CompletionDate = NULL 인 레코드가 유지 관리중인 자동차 일 수도 있습니다. 다시 말하지만, car_maintenance 테이블에 대해 더 많이 알 필요가 있습니다.

한편, car_maintenance 테이블은 지속적으로 변경되지만 현재 유지 보수중인 자동차의 경우 car_number 만 보유하도록 설계 될 수 있습니다.

우리는 실제로 그것을 모릅니다. 따라서 car_maintenance 테이블에있는 내용을 입력하십시오. 우리는 당신의 UPDATE 질의가 "car_availability"의 적절한 SET을 야기 할 수 있도록 그것에 대해 더 알고 싶습니다.

나는 자동차 목록을 산출하려고하는 "블록"으로 Sub Query의 코드 영역을 볼 수 있다고 생각하는 경향이 있습니다. 모든 차가 아니라 일부 차가 있습니다. 현재 유지 보수중인 제품. 그런 식으로 Sub Query를위한 코드를 실행할 때 (필자는 이런 일을 할 때 같은 SQL 창에서 실행 한 다음 잘라내어 붙여 넣기를하고 궁극적으로는 테스트 코드를 제거한다), 당신은 그것을 볼 수있다. , 그리고 참조하십시오 : "이것은 유지 보수에 현재 자동차 세트입니까?" 코드가 만족 스러우면 현재 유지 보수중인 차량을 항상 산출하고 코드에 배치하는 것이 좋습니다.

행운을 비네.