【问题标题】:Ideas/theories on grouping in SQL Server在 SQL Server 中分组的想法/理论
【发布时间】:2014-09-20 00:21:26
【问题描述】:

我正在寻找一些关于如何在 SQL 中构建(以表格方式)无限嵌套组的帮助/想法。

EX.
group1 will contain  a,b,c
group2 will contain  d,e,f
group3 will contain  h,i,j
group4 will contain  k.l.m

groupA will contain group1,group2
groupB will contain group3

groupA1 will contain groupA,groupB,group4

每个最低级别的组将引用不同表中的扫描列表(在此示例中,假设 group1 group2 group3 和 group4 是最低级别)

这应该能够支持无限数量的组

我知道这很模糊,但我正在尝试找出如何构建和管理这样的东西......

我正在尝试表和查询。到目前为止,我有这个:

Scan Table
((uniqueID),barcode,user,date,group)
Groups Table
(groupID,groupName,groupRef)

但我在“创建”GroupA 时遇到问题

就查询而言,我需要知道什么是较低级别的组并获取组中所有项目的列表。

【问题讨论】:

  • 您能否详细说明使用表格和值,或者一个示例,当您说无限数量的组时,我不确定您在寻找什么...您是说要创建一个表格像这样???你想设计一个查询吗???
  • 我认为您将需要某种父/子结构。根据您的小示例,您的表可能有 3 列:IDNAMEPARENT_ID。您的顶级对象在父列中不会有空值,您的最​​低级别永远不会用作父级。
  • 嵌套集是做这种事情的另一种方式。你可以用谷歌搜索“sql 嵌套集”,你会发现大量的例子来说明如何做到这一点。这是一种出色的方法,具有超强的性能。如果您使用邻接模块,您最终将需要递归 ctes 来检索您的数据。如果您有大量数据,这可能会变得非常缓慢。

标签: sql-server grouping


【解决方案1】:

根据您的示例,父子结构似乎可以做到这一点:

CREATE TABLE #ParentChild (Parent VARCHAR(30), Child VARCHAR(30))
INSERT INTO #ParentChild
VALUES
('group1','a'),
('group1','b'),
('group1','c'),
('group2','d'),
('group2','e'),
('group2','f'),
('group3','h'),
('group3','i'),
('group3','j'),
('group4','k'),
('group4','l'),
('group4','m'),
('groupA','group1'),
('groupA','group2'),
('groupB','group3'),
('groupA1','groupA'),
('groupA1','groupB'),
('groupA1','group4')

这将允许您存储(几乎)无限数量的组。 “限制”取决于 SQL Server 版本(例如 SQL Server 2008R2:文件大小(数据):16 TB),应该足够了 ;-)

至于你的具体问题:

--"what are the lower level groups?"
--"i.e., give me all the groups, except those that contain another group
SELECT Parent
FROM #ParentChild
EXCEPT
SELECT t1.Parent
FROM #ParentChild t1
INNER JOIN #ParentChild t2
  ON t1.Child = t2.Parent

--"get a list of all items in a group"
SELECT Child
FROM #ParentChild
WHERE Parent = @Group

另一种选择是使用 hierarchyid hierarchyid 数据类型存储数据

【讨论】:

    【解决方案2】:

    您说的是分层数据。 Sql Server 对此具有内置支持。你应该通读这篇文章:

    http://msdn.microsoft.com/en-us/library/bb677173.aspx

    那篇文章讨论了使用新的 hierarchyid 类型以及父/子替代方案。

    【讨论】:

    • 如果它是像 OP 讨论的那样参差不齐的层次结构,你能用它识别链底部的所有对象吗?
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多