2017-02-24 43 views
1

我不知道這是可能的,但我想要做的事情的本質是有兩個單獨的SELECTS,一個用於單個結果,一個爲兩個結果的聯合。注意:{括號}中的文字只是一個通用的替換。下面讓我在CASE語法錯誤:如何在FROM之前使用CASE語句SELECT之前在更新查詢

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 

我有這個查詢與UPDATE工作 - SET - 內每個兩種情況重複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}'邏輯。謝謝! –

相關問題