在任何情況下,我不會喜歡相關的子查詢。從我看到這是INFORMIX而不是SQL的意見,因此我會建議使用JOIN與嵌套選擇作爲第一首選項。這樣做的好處是這些都是非常原生的編寫查詢方式,您可以期望數據庫優化器使用索引(如果可用)提出良好的執行計劃。 SQL中的 如果我的表不在百萬行中,我會去CTE。我假設你有適當的表格索引。如果不確定你在表格上有以下索引。
注意索引中列的順序及其ASC/DESC順序。
CREATE CLUSTER INDEX IDXc_alt6sal
ON alt6sal ( meg_code ASC,
sal_year DESC,
sal_mon DESC,
emp_num ASC
)
CREATE INDEX IDXnc_alt6sal
ON alt6sal ( meg_code ASC,
sal_year DESC,
sal_mon DESC,
emp_num ASC
) INCLUDE (meg,currency)
現在測試下面的查詢。請注意,當我使用實際表格時,我在所有選擇中都添加了「meg_code IN(1,2)」條件。即使在嵌套的select語句中,也允許查詢減少結果集中所需的行數。還會注意到Where和JOIN條件中的查詢中提及的列與索引中的列順序匹配。
一件事我留給你的是嘗試
「meg_cod = 1或meg_cod = 2」
,而不是
「meg_code IN(1,2)」
並查看性能是否爲明顯提高。我知道如果它是SQL它不會有任何區別,但對於INFORMIX我不是100%確定。
SELECT t1.meg,t1.currency,t1.emp_num
FROM alt6sal t1
JOIN
(
Select yer.emp_num,yer.sal_year,MAX(mth.sal_mon) AS sal_mon
FROM
(SELECT emp_num, MAX(sal_year) AS sal_year
FROM alt6sal
WHERE meg_code IN (1, 2)
GROUP BY emp_num
)yer
JOIN alt6sal mth
ON yer.sal_year = mth.sal_year AND yer.emp_num=mth.emp_num
AND mth.meg_code IN (1,2)
GROUP BY yer.sal_year,yer.emp_num
)t2
ON t1.sal_year=t2.sal_year AND t1.sal_mon=t2.sal_mon AND t1.emp_num=t2.emp_num
AND t1.meg_code IN (1,2)
'a.sal_year>(SELECT MAX(ia.sal_year)'甚至不應該提供一個結果 – bummi
@bummi:抱歉'a.sal_year =(SELECT MAX(ia.sal_year)' –
這是SQL SERVER或INFORMIX?你可以同時標記 – ceinmart