Как упростить этот запрос Sql - PullRequest
1 голос
/ 01 января 2009

Таблица - Запрос имеет 2 столбца (functionId, depFunctionId)

Я хочу, чтобы все значения были либо в functionid, либо в depfunctionid

Я использую это:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

Как это сделать лучше?

Ответы [ 4 ]

6 голосов
/ 01 января 2009

Я думаю, это лучшее, что вы получите.

3 голосов
/ 01 января 2009

Это так хорошо, как только получается, я думаю ...

2 голосов
/ 01 января 2009

Потеряйте предложения DISTINCT, так как ваш UNION (против UNION ALL) позаботится об удалении дубликатов.

Альтернативой - но, возможно, менее ясной и, вероятно, с тем же планом выполнения - было бы выполнить ПОЛНОЕ СОЕДИНЕНИЕ через 2 столбца.

SELECT 
    COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId
FROM Query as Query1
FULL OUTER JOIN Query as Query2 ON
    Query1.FunctionId = Query2.DepFunctionId
0 голосов
/ 01 января 2009

Я почти уверен, что вы можете потерять отличные. Когда вы используете 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 и parent_function_id (или, в вашем случае, functionid и depfunctionid), но триггер может довольно легко об этом позаботиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...