2016-03-21 128 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