表 - 查询有 2 列(functionId、depFunctionId)
我想要所有在 functionid 或 depfunctionid 中的值
我正在使用这个:
select distinct depfunctionid from Query
union
select distinct functionid from Query
如何做得更好?
表 - 查询有 2 列(functionId、depFunctionId)
我想要所有在 functionid 或 depfunctionid 中的值
我正在使用这个:
select distinct depfunctionid from Query
union
select distinct functionid from Query
如何做得更好?
我认为这是你能得到的最好的。
这和我想的一样好...
丢失 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
我几乎可以肯定你可以失去独特的。当您使用 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)构建物化路径,但是触发器可以很容易地处理它。