2016-03-21 165 views
0

我正在尋找關於優化以下示例查詢和處理結果的建議。在使用SQL變種是內部的FileMaker的ExecuteSQL發動機,其可侷限於SELECT語句的語法如下:優化SQL查詢和處理結果

SELECT [DISTINCT] {* | column_expression [[AS] column_alias],...} 
FROM table_name [table_alias], ... 
[ WHERE expr1 rel_operator expr2 ] 
[ GROUP BY {column_expression, ...} ] 
[ HAVING expr1 rel_operator expr2 ] 
[ UNION [ALL] (SELECT...) ] 
[ ORDER BY {sort_expression [DESC | ASC]}, ... ] 
[ OFFSET n {ROWS | ROW} ] 
[ FETCH FIRST [ n [ PERCENT ] ] { ROWS | ROW } {ONLY | WITH TIES } ] 
[ FOR UPDATE [OF {column_expression, ...}] ] 

查詢:

SELECT item1 as val ,interval, interval_next FROM meddata 
    WHERE fk = 12 AND active1 = 1 UNION 
SELECT item2 as val ,interval, interval_next FROM meddata 
    WHERE fk = 12 AND active2 = 1 UNION 
SELECT item3 as val ,interval, interval_next FROM meddata 
    WHERE fk = 12 AND active3 = 1 UNION 
SELECT item4 as val ,interval, interval_next FROM meddata 
    WHERE fk = 12 AND active4 = 1 ORDER BY val 

這可能給出的結果作爲樣本:

val,interval,interval_next 
Artelac,0,1 
Artelac,3,6 
Celluvisc,1,3 
Celluvisc,12,24 

我尋找實現(除優化建議)格式是這樣的結果:

val,interval,interval_next,interval,interval_next,interval,interval_next,interval,interval_next ->etc 
Artelac,0,1,3,6 
Celluvisc,1,3,12,24 

最好我希望這個處理結果由SQL引擎生成。

可能嗎?

謝謝。

編輯:爲了清晰起見,我在結果中包括了列名,儘管它們不是結果的一部分。我想說明結果中可能有任意數量的'interval'和'interval_next'列。

+0

它是否有'when then case'條款? – wonderbell

+0

@wonderbell是的,支持'時候的情況'。 – AndreasT

+0

只能在一行中找到獨特的val(例如Artelac)嗎?它可以在兩行以上找到嗎?例如,你可以有:{Artelac,0,1},{Artelac,3,6}和{Artelac,4,8}?在這些情況下,期望的結果是什麼? –

回答

1

我不認爲你需要優化你的查詢,看起來很好。

您正在尋找TSQL中的PIVOT之類的東西,這在FQL中不受支持。你最大的問題將是返回的可變數量的列。

我認爲最好的方法是獲得您的中間結果,並使用FileMaker腳本或自定義函數來實現它。

另一種方法是使用FQL語句爲每一行獲取不同的val和循環的列表(使用CF或腳本)。由於需要相同數量的列,因此無法將它們與聯合組合在一起。

+0

感謝您的意見。很高興知道我在查詢本身的正確軌道上。我將研究連接作業的遞歸CF或FM腳本。 – AndreasT