表 - 查询有2列(functionId,depFunctionId)
我想要所有在functionid或depfunctionid中的值
我正在使用它:
select distinct depfunctionid from Query
union
select distinct functionid from Query
如何做得更好?
答案 0 :(得分:6)
我认为这是你能得到的最好的。
答案 1 :(得分:3)
这就像我想的那样好......
答案 2 :(得分:2)
丢失DISTINCT子句,因为你的UNION(vs UNION ALL)将负责删除重复项。
另一种选择 - 但可能不那么清晰,可能具有相同的执行计划 - 将在两列中进行全加入。
SELECT
COALESCE(Query1.FunctionId, Query2.DepFunctionId) as FunctionId
FROM Query as Query1
FULL OUTER JOIN Query as Query2 ON
Query1.FunctionId = Query2.DepFunctionId
答案 3 :(得分: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)构造物化路径,但触发器可以很容易地处理它。