GVKun编程网logo

在SQL Server中查找顶级父级的最有效方法?(sql查询父级下所有子集)

10

在本文中,您将会了解到关于在SQLServer中查找顶级父级的最有效方法?的新资讯,同时我们还将为您解释sql查询父级下所有子集的相关在本文中,我们将带你探索在SQLServer中查找顶级父级的最有效

在本文中,您将会了解到关于在SQL Server中查找顶级父级的最有效方法?的新资讯,同时我们还将为您解释sql查询父级下所有子集的相关在本文中,我们将带你探索在SQL Server中查找顶级父级的最有效方法?的奥秘,分析sql查询父级下所有子集的特点,并给出一些关于c# – 使用LINQ在List中查找顶级父级、SQL Server中从日期和时间获取日期的最有效方法?、sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?、sql-server – 在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?的实用技巧。

本文目录一览:

在SQL Server中查找顶级父级的最有效方法?(sql查询父级下所有子集)

在SQL Server中查找顶级父级的最有效方法?(sql查询父级下所有子集)

给出下表

catName     catID     parentID=================================vehicles    1         0cars        2         1sedans      3         2animals     4         0cows        5         4

给定一个catID,我需要找到其顶级父级(parentID = 0)。

每天执行50-100次此查询。当前有100-200行(将来可能会更多)。多达8个层次的深度。我在考虑三种选择:

  1. 使用递归方法
  2. 创建一个视图
  3. 添加另一列topParentID(最不满意)

哪个效率最高?

答案1

小编典典

SQL2008 +:

为了存储层次结构,SQL Server包含HIERARCHYID数据类型。可以将上述数据“转换为”以使用HIERARCHYID“值”:

catName     catID     parentID  hierarchyNode=============================================vehicles    1         0         /1/cars        2         1         /1/2/sedans      3         2         /1/2/3/animals     4         0         /4/cows        5         4         /4/5/

转换后,我将删除parentID列。

HIERARCHYID是SQLCLR系统数据类型,其中包括以下方法:

  • HidValue。GetLevel()
  • HidValue。GetAncestor(level)。

为了获得父节点,我将使用以下方法:

DECLARE @node HIERARCHYIDSET     @node = ''/1/2/3/''SELECT      currentNodeLvl= @node.GetLevel(),                                 --> 3    parentAsHID   = @node.GetAncestor(@node.GetLevel() - 1),          --> 0x58    parentAsString= @node.GetAncestor(@node.GetLevel() - 1).ToString()--> /1/

此外,我将在hierarchyNode列上创建索引,因此:

CREATE UNIQUE INDEX IUN_Table_hierarchyNodeON dbo.Table(hierarchyNode)

最后的查询将是:

SELECT ..., prt.catID AS parentIDFROM dbo.Table crt -- Curent nodeLEFT/INNER JOIN -- It depends on hierarchyID nullability dbo.MyTable prt -- Parent nodeON @node.GetAncestor(crt.hierarchyID.GetLevel() - 1).ToString() = prt.hierarchyID

c# – 使用LINQ在List中查找顶级父级

c# – 使用LINQ在List中查找顶级父级

我有一个具有ID和ParentID的用户定义对象列表.列表看起来像这样.

ParentID     ID
  123        345
  123        456
  456        567
  456        678
  678        789

我需要一个LINQ语句来查找顶级父级;也就是说,ParentID不存在的所有对象都作为ID(在本例中,仅为123).

这是我到目前为止,它返回567,678,789.

parentList = baseList.Where(b => !baseList.Select(o => o.ParentID).distinct().Contains(b.ID)).ToList();

解决方法

您当前的查询正在尝试查找其ID与任何其他项目的父ID不对应的所有项目 – 换句话说,您正在查找所有无子节点.

你想要的是所有无父节点 – 那些父ID与任何其他项的ID不匹配的节点.

var ids = new HashSet<int>(baseList.Select(o => o.ID));
var itemsWithnoparent = baseList.Where(o => !ids.Contains(o.ParentID))
    .ToList();

我正在使用HashSet<>确保合理.Contains()在大型集合上的表现.

SQL Server中从日期和时间获取日期的最有效方法?

SQL Server中从日期和时间获取日期的最有效方法?

在MS SQL 2000和2005中,给定日期时间(例如‘2008-09-25 12:34:56’),获取仅包含‘2008-09-25’的日期时间的最有效方法是什么?

sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?

sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?

我处于这样一种情况,我希望从6列中获得最小值.

到目前为止,我已经找到了三种方法来实现这一目标,但我对这些方法的性能表示担忧,并希望知道哪种方法对性能更好.

第一种方法是使用a big case statement.这是一个包含3列的示例,基于上面链接中的示例.我的案例陈述会更长,因为我将查看6列.

Select Id,Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
            When Col2 <= Col3 Then Col2 
            Else Col3
            End As TheMin
From   MyTable

第二个选项是使用UNION operator with multiple select statements.我会把它放在一个接受Id参数的UDF中.

select Id,dbo.GetMinimumFromMyTable(Id)
from MyTable

select min(col)
from
(
    select col1 [col] from MyTable where Id = @id
    union all
    select col2 from MyTable where Id = @id
    union all
    select col3 from MyTable where Id = @id
) as t

我找到的第三个选项是use the UNPIVOT operator,直到现在我才知道它是不存在的

with cte (ID,Col1,Col2,Col3)
as
(
    select ID,Col3
    from TestTable
)
select cte.ID,Col3,TheMin from cte
join
(
    select
        ID,min(Amount) as TheMin
    from 
        cte 
        UNPIVOT (Amount for AmountCol in (Col1,Col3)) as unpvt
    group by ID
) as minValues
on cte.ID = minValues.ID

由于表的大小以及查询和更新此表的频率,我担心这些查询对数据库的性能影响.

此查询实际上将用于连接到具有几百万条记录的表,但是返回的记录将一次减少到大约一百条记录.它将在一天中运行多次,我查询的6列经常更新(它们包含每日统计数据).我不认为我查询的6列上有任何索引.

在尝试获得最少的多列时,哪种方法更适合性能?或者还有另一种我不知道的更好的方法吗?

我正在使用sql Server 2005

样本数据&结果

如果我的数据包含这样的记录:

Id    Col1    Col2    Col3    Col4    Col5    Col6
1        3       4       0       2       1       5
2        2       6      10       5       7       9
3        1       1       2       3       4       5
4        9       5       4       6       8       9

最终结果应该是

Id    Value
1        0
2        2
3        1
4        4

解决方法

我测试了所有3种方法的性能,这是我发现的:

> 1记录:没有明显的差异
> 10条记录:无明显差异
> 1,000条记录:无明显差异
> 10,000条记录:UNION子查询速度稍慢. CASE WHEN查询比UNPIVOT查询快一点.
> 100,000条记录:UNION子查询明显变慢,但UNPIVOT查询比CASE WHEN查询快一点
> 500,000条记录:UNION子查询仍然明显变慢,但UNPIVOT变得比CASE WHEN查询快得多

所以最终的结果似乎是

>对于较小的记录集,似乎没有足够的差异.使用最容易阅读和维护的内容.
>一旦开始进入更大的记录集,UNION ALL子查询与其他两种方法相比开始表现不佳.
> CASE语句在某个点(在我的情况下,大约100k行)中执行最佳,并且UNPIVOT查询成为性能最佳的查询

由于您的硬件,数据库架构,数据和当前服务器负载,一个查询变得比另一个更好的实际数量可能会发生变化,因此如果您担心性能,请务必使用您自己的系统进行测试.

我还使用Mikael’s answer进行了一些测试;但是,它比大多数记录集大小的其他3种方法都要慢.唯一的例外是它比非常大的记录集大小的UNION ALL查询要好.我喜欢它除了显示最小值之外还显示列名的事实.

我不是dba,所以我可能没有优化我的测试并错过了一些东西.我正在测试实际的实时数据,因此可能会影响结果.我尝试通过运行每个查询几次来解释这一点,但你永远不会知道.如果有人写了一个干净的测试并分享他们的结果,我肯定会感兴趣.

sql-server – 在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?

sql-server – 在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?

在处理sql Server时,我需要多次编写类似下面的内容.
create table #table_name
(
    column1 int,column2 varchar(200)
    ...
)

insert into #table_name
execute some_stored_procedure;

但是创建一个具有确切语法的表,因为存储过程的结果是一项繁琐的任务.例如,sp_helppublication的结果有48列!我想知道是否有任何简单的方法可以做到这一点.

谢谢.

解决方法

如果该过程只返回一个结果集并且启用了 ad hoc distributed queries选项.
SELECT * 
INTO #T 
FROM OPENROWSET('sqlNCLI','Server=(local)\MSsql2008;Trusted_Connection=yes;','SET FMTONLY OFF;EXEC sp_who')

或者您可以设置一个环回链接服务器并使用它.

EXEC sp_addlinkedserver @server = 'LOCALSERVER',@srvproduct = '',@provider = 'sqlNCLI',@datasrc = @@servername

SELECT *
INTO  #T
FROM OPENQUERY(LOCALSERVER,'SET FMTONLY OFF;
               EXEC sp_who')

今天关于在SQL Server中查找顶级父级的最有效方法?sql查询父级下所有子集的介绍到此结束,谢谢您的阅读,有关c# – 使用LINQ在List中查找顶级父级、SQL Server中从日期和时间获取日期的最有效方法?、sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?、sql-server – 在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?等更多相关知识的信息可以在本站进行查询。

本文标签: