2017-02-24 4 views
1

이것이 가능한지 확실하지 않지만 내가하려는 것은 두 개의 별도 SELECTS, 하나는 하나의 결과 만 들어야합니다. 두 결과의 결합 참고 : {brackets}의 텍스트는 일반적인 대체 코드 일뿐입니다. 아래는 나에게 CASE에 구문 오류가 있습니다 : - SET - 나는 UPDATE 작업이 쿼리 했어업데이트 쿼리에서 SELECT 전에 FROM 뒤에 CASE 문을 사용하는 방법

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
CASE 
    WHEN {case A} THEN 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
    ELSE 
     ((SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
     UNION 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {other_conditions} 
     LIMIT 1)) 
END CASE; 
AS MyOtherTable 
WHERE MyTable.product_id = MyOtherTable.product_id 

두 경우 각각의 내부에 중복 FROM 부분을,하지만 난에 중복을 손질하기 위해 노력하고있어 가능한 경우 쿼리. 또한 각각의 케이스 안에 FROM을 옮겨 보았지만 구문 오류도 발생했습니다.

답변

1

case 표현식을 사용하여 문에 사용 된 개체를 조합 할 수 없습니다. 당신은, 그러나,이 구조를 모방 논리 연산자를 사용할 수 있습니다, 그래서 {other_conditions}와 값은 발생하지 않습니다 {case A} 경우에 사용됩니다 유사한

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
((SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE {conditions} 
LIMIT 1) 
UNION 
(SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE (NOT ({case A})) AND ({other_conditions}) -- Here! 
LIMIT 1)) 
+1

그래, 내가 생각했던 뭔가를. 이것은 트리거 함수의 내부에 있고, 'A'는 값이 'OLD'에서 NULL이거나 'NEW'와 'OLD'에서 동일합니다. 업데이트가 단일 행 또는 동일한 행과 다른 행을 수정하기 때문입니다. 유니온 된 선택을 단순히 포함하는 것에서 너무 많은 오버 헤드가 생길 까봐 두려웠지만'NOT {case A} '로직을 고려하지 않았습니다. 감사! –