Как упростить этот запрос Sql
-
03-07-2019 - |
Вопрос
Таблица – запрос имеет 2 столбца (functionId, depFunctionId).
Мне нужны все значения, которые находятся либо в functionid, либо в depfunctionid.
Я использую это:
select distinct depfunctionid from Query
union
select distinct functionid from Query
Как это сделать лучше?
Решение
Я думаю, это лучшее, что ты получишь.
Другие советы
Это как нельзя лучше, я думаю...
Откажитесь от предложений DISTINCT, поскольку ваш UNION (против UNION ALL) позаботится об удалении дубликатов.
Альтернативой - но, возможно, менее понятной и, вероятно, с тем же планом выполнения - было бы выполнение FULL JOIN для двух столбцов.
SELECT
COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId
FROM Query as Query1
FULL OUTER JOIN Query as Query2 ON
Query1.FunctionId = Query2.DepFunctionId
Я почти уверен, что вы можете потерять различия.Когда вы используете UNION вместо UNION ALL, повторяющиеся результаты отбрасываются.
Все зависит от того, насколько тяжелым является ваш запрос встроенного представления.Ключом к повышению производительности было бы выполнение только один раз, но это невозможно, учитывая данные, которые он возвращает.
Если вы сделаете это так:
select depfunctionid , functionid from Query
group by depfunctionid , functionid
Весьма вероятно, что вы получите повторяющиеся результаты для depfunctionid или functionid.
Возможно, я ошибаюсь, но мне кажется, что вы пытаетесь получить дерево зависимостей.Если это так, я бы лично попробовал использовать подход материализованного пути.
Если материализованный путь хранится в имени таблицы, ссылающейся на себя, я бы получил дерево, используя что-то вроде
select asrt2.function_id
from a_self_referencig_table asrt1,
a_self_referencig_table asrt2
where asrt1.function_name = 'blah function'
and asrt2.materialized_path like (asrt1.materialized_path || '%')
order by asrt2.materialized_path, asrt2.some_child_node_ordering_column
Это позволит получить все дерево в правильном порядке.Что отстойно, так это необходимость строить материализованный путь на основе function_id и родительской_функции_id (или, в вашем случае, functionid и depfunctionid), но триггер может довольно легко позаботиться об этом.