在本文中,您将会了解到关于在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查询父级下所有子集)
- c# – 使用LINQ在List中查找顶级父级
- SQL Server中从日期和时间获取日期的最有效方法?
- sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?
- sql-server – 在SQL Server中创建可以保存存储过程结果的临时表的最简单方法是什么?
在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个层次的深度。我在考虑三种选择:
- 使用递归方法
- 创建一个视图
- 添加另一列
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中查找顶级父级
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不匹配的节点.
var ids = new HashSet<int>(baseList.Select(o => o.ID)); var itemsWithnoparent = baseList.Where(o => !ids.Contains(o.ParentID)) .ToList();
我正在使用HashSet<>确保合理.Contains()在大型集合上的表现.
SQL Server中从日期和时间获取日期的最有效方法?
在MS SQL 2000和2005中,给定日期时间(例如‘2008-09-25 12:34:56’),获取仅包含‘2008-09-25’的日期时间的最有效方法是什么?
sql-server – 在SQL Server 2005上获得最少多列的最有效方法是什么?
到目前为止,我已经找到了三种方法来实现这一目标,但我对这些方法的性能表示担忧,并希望知道哪种方法对性能更好.
第一种方法是使用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
解决方法
> 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中创建可以保存存储过程结果的临时表的最简单方法是什么?
create table #table_name ( column1 int,column2 varchar(200) ... ) insert into #table_name execute some_stored_procedure;
但是创建一个具有确切语法的表,因为存储过程的结果是一项繁琐的任务.例如,sp_helppublication的结果有48列!我想知道是否有任何简单的方法可以做到这一点.
谢谢.
解决方法
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中创建可以保存存储过程结果的临时表的最简单方法是什么?等更多相关知识的信息可以在本站进行查询。
本文标签: