1

表 - 查询有 2 列(functionId、depFunctionId)

我想要所有在 functionid 或 depfunctionid 中的值

我正在使用这个:

select distinct depfunctionid from Query
union 
select distinct functionid from Query

如何做得更好?

4

4 回答 4

6

我认为这是你能得到的最好的。

于 2009-01-01T17:20:26.297 回答
3

这和我想的一样好...

于 2009-01-01T17:22:29.443 回答
2

丢失 DISTINCT 子句,因为您的 UNION(与 UNION ALL 相比)将负责删除重复项。

另一种选择 - 但可能不太清楚并且可能具有相同的执行计划 - 是跨 2 列执行 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
于 2009-01-01T20:48:58.857 回答
0

我几乎可以肯定你可以失去独特的。当您使用 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)构建物化路径,但是触发器可以很容易地处理它。

于 2009-01-01T19:30:02.837 回答