Sql server 如何简化此Sql查询
表查询有两列(functionId、depFunctionId) 我需要functionid或depfunctionid中的所有值 我用的是:Sql server 如何简化此Sql查询,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,表查询有两列(functionId、depFunctionId) 我需要functionid或depfunctionid中的所有值 我用的是: select distinct depfunctionid from Query union select distinct functionid from Query 如何做得更好?我认为这是你能得到的最好的。我认为这是你能得到的最好的。我认为这是最好的 我想这是最好的了 我几乎可以肯定,你可以松开distinct的。 使用UNION而不是UNIO
select distinct depfunctionid from Query
union
select distinct functionid from Query
如何做得更好?我认为这是你能得到的最好的。我认为这是你能得到的最好的。我认为这是最好的 我想这是最好的了 我几乎可以肯定,你可以松开distinct的。 使用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
这将以正确的顺序检索整棵树。最糟糕的是必须基于函数id和父函数id(或者在您的情况下是functionid和depfunctionid)构建物化路径,但是触发器可以很容易地处理它。我几乎可以肯定您可以取消distinct。 使用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
这将以正确的顺序检索整棵树。最糟糕的是必须基于函数id和父函数id(或者在您的情况下是functionid和depfunctionid)构造物化路径,但是触发器可以很容易地处理它。丢失不同的子句,因为您的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
丢失不同的子句,因为您的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
关于不同关键字的观点是好的。我担心其余的都没有抓住重点。最后一个查询无法编译-选择列表中的函数\u id不明确。感谢您指出错误。实际上,我并不是在数据库控制台前。关于不同关键字的观点很好。我担心其余的都没有抓住重点。最后一个查询无法编译-选择列表中的函数\u id不明确。感谢您指出错误。我实际上并不是在数据库控制台前面。