优化SQL查询和处理结果

时间:2016-03-21 13:32:24

标签: sql filemaker

我正在寻找有关优化以下示例查询和处理结果的建议。正在使用的SQL变体是内部FileMaker ExecuteSQL引擎,它仅限于SELECT语句,语法如下:

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'列。

1 个答案:

答案 0 :(得分:1)

我认为你不需要优化查询,看起来很好。

您正在寻找类似于TSQL中的PIVOT,这在FQL中是不受支持的。您最大的问题是返回的列数可变。

我认为最好的方法是获取中间结果并使用FileMaker脚本或自定义函数来旋转它。

另一种方法是获取不同的val列表并通过它们(使用CF或脚本)循环使用每行的FQL语句。您将无法将它们与union结合使用,因为它需要相同数量的列。