我正在寻找有关优化以下示例查询和处理结果的建议。正在使用的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'列。
答案 0 :(得分:1)
我认为你不需要优化查询,看起来很好。
您正在寻找类似于TSQL中的PIVOT,这在FQL中是不受支持的。您最大的问题是返回的列数可变。
我认为最好的方法是获取中间结果并使用FileMaker脚本或自定义函数来旋转它。
另一种方法是获取不同的val列表并通过它们(使用CF或脚本)循环使用每行的FQL语句。您将无法将它们与union结合使用,因为它需要相同数量的列。