2016-03-21 2 views
0

Я ищу совет по оптимизации следующего примерного запроса и обработки результата. Вариант SQL-использование представляет собой двигатель внутреннего FileMaker ExecuteSQL который ограничен ЗЕЬЕСТ со следующим синтаксисом:Оптимизировать 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.

Возможно?

спасибо.

EDIT: Я включил имена столбцов в результат для ясности, хотя они не являются частью результата. Я хочу проиллюстрировать, что в результате может быть произвольное количество столбцов «interval» и «interval_next».

+0

Есть ли в этом случае предложение «case when then»? – wonderbell

+0

@wonderbell Да, 'case when then' поддерживается. – AndreasT

+0

Может ли отдельный val (например, Artelac) найти только одну строку? Его можно найти более чем в 2 строках? Например, можете ли вы: {Артелак, 0,1}, {Артелак, 3,6} и {Артелак, 4,8}? В таких случаях, какими будут ожидаемые результаты? –

ответ

1

Я не думаю, что вам нужно оптимизировать ваш запрос, отлично выглядит для меня.

Вы ищете что-то вроде PIVOT в TSQL, которое не поддерживается в FQL. Самая большая проблема - это переменное количество возвращенных столбцов.

Я думаю, что лучший подход - получить промежуточный результат и использовать скрипт FileMaker или Custom Function для его поворота.

Альтернативой является получение списка различных значений val и loop через них (с CF или скриптом) с помощью FQL Statement для каждой строки. Вы не сможете объединить их с объединением, так как ему нужно одинаковое количество столбцов.

+0

Благодарим вас за ввод. Хорошо знать, что я на правильном пути с самим запросом. Я рассмотрю рекурсивный сценарий CF или FM для задания конкатенации. – AndreasT