Вопрос

Таблица – запрос имеет 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), но триггер может довольно легко позаботиться об этом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top