我已經繼承了絕望需要重構的SQL查詢。查詢(6頁長)看起來是這樣的:使用不同的WHERE子句重構類似的子查詢
SELECT (count(*) from tab1, tab2, tab3 where tab1.value1 is not null
and tab2.tab3id = tab3.id and tab3.value4 in (1,2,3) and tab3.value3 = 15 and tab2.value2 = 10 [...]) as RESULT1,
SELECT (sum(tab3.value5) from [EXACT SAME QUERY AS ABOVE]) AS RESULT1_SUM
SELECT (count(*) from tab1, tab2, tab3 where tab1.value1 is not null
and tab2.tab3id = tab3.id and tab3.value4 in (1,2,3) and tab3.value3 = 15 and tab2.value2 = 27 [...]) as RESULT2,
...[AD NAUSEAM for several more columns]
UNION
SELECT [same as first query, but now tab1.value1 is NULL]
...[now sum()]
FROM DUAL [of course!]
這種混亂的最終結果是一個2行/ 16列結果,其中行由tab1.value1是否處於零不同(主要是複製和粘貼)子查詢,並且列的不同之處在於子查詢的WHERE子句的其他值中的小的任意變化。
RESULT1 RESULT1_SUM RESULT2 RESULT2_SUM ...
IS_NOT_NULL 300 120000 90 80000
IS_NULL 70 90000 54 95000
我必須複製這個相同的輸出。我的第一本能是將子查詢的常見元素放入WITH子句中。但我堅持如何獲得複製的「WHERE子句 - >不同的命名列」元素的微小變化,而不必爲每列使用單獨的子查詢。
我應該把它吸收並將子查詢轉儲到全局臨時表中還是有更好的方法?
CAn讓它使用Case語句而不是子查詢? – HLGEM
好吧,我發現我可以在FROM子句中有多個子查詢,但不加入它們,允許我在那裏設置列名,並且仍然能夠將子查詢的公共部分分解爲WITH子句。 它仍然有點冗餘,但看起來更好,至少。 – user1541898
@HLGEM,也許對於總和部分,但它會看起來凌亂。我從來沒有在COUNT()聚合中看到CASE語句......這是否有效? – user1541898