這是我在一個更大的SQL腳本中的子查詢。它在多個不同的CASE語句中執行相同的操作,所以我希望我能以某種方式組合這個動作,所以它不必一遍又一遍地做同樣的事情。但是,如果將ORDER BY命令移到CASE語句之外,我無法得到正確的結果。優化類似的MySQL子查詢
我在JDAY上加入了2個表格met_data和flexgridlayers_table。 Flexgridlayers_table具有JDAY和Segment的字段,met_data具有JDAY,TAIR和TDEW字段(在這個簡單示例中,實際上是更多字段)。我通過Matlab運行這個,所以變量1和變量2是由嵌套循環設置的值。我需要使用CASE語句來說明變量1不等於1的情況,那麼我想輸出0.否則,我想查找與JDAY連接對應的值,但這些值可能不完全匹配F.JDAY和M.JDAY。我想匹配最接近的< =值,所以我在每個子查詢中使用ORDER BY M.JDAY DESC LIMIT 1語句。
輸出是一個包含字段JDAY(來自F.JDAY),TAIR和TDEW的表格。每當我嘗試移動CASE語句之外的ORDER BY部分來擺脫重複的子查詢時,我只得到一行結果來表示最大的JDAY。這個查詢給了我正確的結果 - 有沒有一種方法來優化這個?
SELECT F.JDAY,
CASE
WHEN *variable1*<>1 THEN 0
ELSE
(SELECT M.TAIR
FROM met_data AS M
WHERE M.Year=2000 AND M.JDAY<=F.JDAY
ORDER BY M.JDAY DESC LIMIT 1)
END AS TAIR,
CASE
WHEN *variable1*<>1 THEN 0
ELSE
(SELECT M.TDEW
FROM met_data AS M
WHERE M.Year=2000 AND M.JDAY<=F.JDAY
ORDER BY M.JDAY DESC LIMIT 1)
END AS TDEW
FROM FlexGridLayers_table AS F
WHERE F.SEGMENT=*variable2*
進一步解釋:
該查詢將從flexgridlayers_table翻出所有JDAY值,然後將表met_data內搜索以找到對應於該表中最接近< = JDAY值的值。例如,請考慮以下flexgridlayers_table和met_data表:
flexgridlayers_table:
Segment JDAY
2 1.5
2 2.5
2 3.5
3 1.5
3 2.5
3 3.5
met_data:
JDAY Year TAIR TDEW
1.0 2000 7 8
1.1 2000 9 10
1.6 2000 11 12
2.5 2000 13 14
2.6 2000 15 16
3.4 2000 17 18
4.0 2000 19 20
我想(和什麼上面返回查詢)會是這樣,對於變量1 = 1和變量2 = 2:
JDAY TAIR TDEW
1.5 9 10
2.5 13 14
3.5 17 18
我只是想知道是否有更有效的方式來編寫此查詢,所以我沒有對每個TAIR,TDEW等字段反覆執行相同的JDAY值列表上的ORDER BY命令。
http://stackoverflow.com/questions/12925140/how-to-estimate-sql-query-timing/12925406#12925406 – felipsmartins
此查詢需要32秒5個子查詢和* variable1 * = 1。我不確定還有什麼可以從您的鏈接中獲取... – Amy
請發佈此查詢的解釋。 – Michael