Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何简化此Sql查询_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 如何简化此Sql查询

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

表查询有两列(functionId、depFunctionId)

我需要functionid或depfunctionid中的所有值

我用的是:

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不明确。感谢您指出错误。我实际上并不是在数据库控制台前面。