访问 2010 递归数据

Posted

技术标签:

【中文标题】访问 2010 递归数据【英文标题】:access 2010 recursive data 【发布时间】:2012-08-22 03:01:46 【问题描述】:

我不仅仅是 Access 2010 的新手,但肯定不是专家。我每天都在使用 Access,但这个问题让我很头疼。

我需要查询一个表以检索一组组、子组和所有可能的子成员。 该表的布局如下:

所需的组 |当前田纳西州 |冲刺电话号码 |姓氏 |名字 5553215255 | 5553210001 | 4143210009 |堰鲍勃 5553215255 | 5553210002 | 4143210008 |加西亚·杰瑞 5553215255 |5553210003 | 4143210007 |亨德里克斯·吉米 5553215255 | 5553210004 | 4143210006 | Peds 页面 5553210004 | 3144230009 | 4143210005 |现金强尼 5553210004 | 3144230008 | 4143210003 |莫里森·吉姆 5553210004 | 3144230007 | 4143210002 |贝多芬路德维希 5553210004 | 3144230911 | 4143210001 |急救人员页面 3144230911 | 6362341101 | 4143210099 |弹奏者乔 3144230911 | 6362341101 | 4143210098 |水星房地美 3144230911 | 6362341101 | 4143210097 |普雷斯利·埃尔维斯 3144230911 | 6362341101 | 4143210096 |波波大

定义的字段:

Desired GROUP:基于角色或其他标准的一组人。寻呼时,此号码将向给定组的成员发送寻呼。 当前 TN:给定成员的电话。成员可以是个人或 Desired GROUP Sprint 电话号码:有些人会用 Sprint 电话替换他们的寻呼机。 姓氏:角色或个人的姓氏。有时是组名或类似名称。 名字:一个人的名字

我需要一个查询,在运行时返回所有分页组的所有成员的列表。 假设我向医生发送页面。寻呼医生还寻呼 Peds 的所有成员,这反过来又寻呼紧急 Peds 的所有成员 结果将显示所有医生成员、所有 Peds 成员(除组名)和所有被寻呼的紧急 Peds 成员的初始页面。注意 Peds Page 和 Emergency Peds Page 被排除在外。此处说明:

所需的组 |当前田纳西州 |冲刺电话号码 |姓氏 |名字 5553215255 | 5553210001 | 4143210009 |堰鲍勃 5553215255 | 5553210002 | 4143210008 |加西亚·杰瑞 5553215255 |5553210003 | 4143210007 |亨德里克斯·吉米 5553210004 | 3144230009 | 4143210005 |现金强尼 5553210004 | 3144230008 | 4143210003 |莫里森·吉姆 5553210004 | 3144230007 | 4143210002 |贝多芬路德维希 3144230911 | 6362341101 | 4143210099 |弹奏者乔 3144230911 | 6362341101 | 4143210098 |水星房地美 3144230911 | 6362341101 | 4143210097 |普雷斯利·埃尔维斯 3144230911 | 6362341101 | 4143210096 |波波大

    一位同事建议手动查询多次,将结果保存到多个表中,然后将所有结果表附加到一个表中。我该怎么做呢?看来这是一个我在我的水平上很容易理解的解决方案,但我不太明白,尽我所能尝试。 除了上面的解决方法,还有其他方法吗? 如果我将第二个类似的表与第一个进行比较,我还需要知道什么吗?第二个的成员可能是第一个的小组负责人。

提前非常感谢。


编辑以包含来自 cmets 的 sql。

SELECT * 
FROM   (SELECT tbl_group_build.[desired group],tbl_group_build.[current tn], 
                   tbl_group_build.[sprint telephone number], 
                   tbl_group_build.[last name], 
                   tbl_group_build.[first name] 
    FROM   tbl_group_build 
    UNION 
    SELECT tbl_Group_build_1.[desired group],tbl_Group_build_1.[current tn], 
           tbl_Group_build_1.[sprint telephone number], 
           tbl_Group_build_1.[last name],tbl_Group_build_1.[first name] 
    FROM   tbl_group_build 
           INNER JOIN tbl_group_build AS tbl_Group_build_1 
                   ON tbl_group_build.[current tn] = 
                      tbl_Group_build_1.[desired group] 
    UNION 
    SELECT tbl_Group_build_2.[desired group],tbl_Group_build_2.[current tn], 
           tbl_Group_build_2.[sprint telephone number], 
           tbl_Group_build_2.[last name],tbl_Group_build_2.[first name] 
    FROM   (tbl_group_build 
            INNER JOIN tbl_group_build AS tbl_Group_build_1 
                    ON tbl_group_build.[current tn] = 
                       tbl_Group_build_1.[desired group]) 
           INNER JOIN tbl_group_build AS tbl_Group_build_2 
                   ON tbl_Group_build_1.[current tn] = 
                      tbl_Group_build_2.[desired group]) g 

【问题讨论】:

你想达到什么输出?您的解释过于复杂,我不确定您实际上希望从查询中得到什么。一次归还所有东西不是更有意义吗?此外,如果这确实是一个表而不是查询,您应该考虑对其进行规范化。 同意规范化,但不幸的是,我们已经过了这一点。我被告知此时不要担心。 是否有一个单独的表格表明哪些组被分页了?成员是否属于多个组?有什么方法可以根据数据库中的数据知道子组是什么? 同意规范化,但不幸的是,我们已经过了这一点。我被告知此时不要担心。至于我想要实现的目标:假设我向医生组的领导号码发送了一个页面。从那里它向该组中的医生和 Peds Page 发送一个页面,该页面是另一个组的负责人。 Peds Page 然后对所有成员进行寻呼,其中包括紧急 Peds 页面编号,该编号是紧急 Peds 的潜在客户编号。我的老板希望看到看起来类似于第二个表格示例的最终结果(我现在将清理它)。 所有潜在客户都在 GROUP NUMBER 列中。成员 TN 中的一些是其中一些相同的线索。 MEMBER TN 列中没有不在 GROUP NUMBER 列中的潜在客户。我尝试了“SELF-JOIN”,还复制了我的原始表格并将 LEAD NUMBER 从原始表格加入副本上的 MEMBER TN。如果我将其中一个表中的所有字段拉到网格中,我会得到原始集合的副本。所以显然我没有从正确的表格中删除正确的字段。 【参考方案1】:

这是一个想法的开始。我注意到在样本数据中,组长的电话号码与页面的电话号码相同。还有其他可能的连接,但这是迄今为止最干净的。

SELECT * 
FROM   (SELECT groups.group_name, 
               groups.[group_lead member], 
               groups.tn, 
               groups.last_name, 
               groups.first_name 
        FROM   groups 
        WHERE  groups.group_name = [enter page] 
        UNION 
        SELECT Groups_1.group_name, 
               Groups_1.[group_lead member], 
               Groups_1.tn, 
               Groups_1.last_name, 
               Groups_1.first_name 
        FROM   groups 
               INNER JOIN groups AS Groups_1 
                       ON groups.tn = Groups_1.[group_lead member] 
        UNION 
        SELECT Groups_2.group_name, 
               Groups_2.[group_lead member], 
               Groups_2.tn, 
               Groups_2.last_name, 
               Groups_2.first_name 
        FROM   (groups 
                INNER JOIN groups AS Groups_1 
                        ON groups.tn = Groups_1.[group_lead member]) 
               INNER JOIN groups AS Groups_2 
                       ON Groups_1.tn = Groups_2.[group_lead member]) g 
WHERE  Trim(Replace([last_name], "page", "")) 
       NOT IN (SELECT DISTINCT group_name FROM groups) 

新数据

SELECT * 
FROM   (SELECT groups.[desired group],groups.[current tn], 
                       groups.[sprint telephone number], 
                       groups.[last name],groups.[first name] 
        FROM   groups 
        WHERE  groups.[desired group] = [enter desired group] 
        UNION 
        SELECT Groups_1.[desired group],Groups_1.[current tn], 
               Groups_1.[sprint telephone number],Groups_1.[last name], 
               Groups_1.[first name] 
        FROM   groups 
               INNER JOIN groups AS Groups_1 
                       ON groups.[current tn] = Groups_1.[desired group] 
        UNION 
        SELECT Groups_2.[desired group],Groups_2.[current tn], 
               Groups_2.[sprint telephone number],Groups_2.[last name], 
               Groups_2.[first name] 
        FROM   (groups 
                INNER JOIN groups AS Groups_1 
                        ON groups.[current tn] = Groups_1.[desired group]) 
               INNER JOIN groups AS Groups_2 
                       ON Groups_1.[current tn] = Groups_2.[desired group]) AS g 
WHERE  g.[last name] NOT IN (SELECT [last name] 
                                    FROM   groups 
                                    WHERE  [current tn] IN (SELECT DISTINCT 
                                                           [desired group] 
                                                            FROM   groups))  

【讨论】:

感谢您的帮助。这看起来是一个很好的线索。当 GROUP_NAME 不存在时,我不小心包含了它(它在我的另一个表中)。所以我有 group_lead、member_tn、last_name 和 first_name。我正在尝试相应地编辑您的代码。但是我陷入了第一个 where 语句。我应该如何相应地编辑它? 你不能。一大块逻辑依赖于 Group_Name。创建一个名为 Groups 的查询,以匹配上述名称,并包含具有 Group_Name 的表和包含其他数据的表,以便您的查询与您发布的示例数据相匹配。然后,您应该能够“按原样”运行上述内容。 我尝试了编辑,但刚刚恢复了初始结果集。我为我最初更改的真实表名等进行了编辑,以简化我的示例(看起来我实际上使事情变得复杂。)我不会在这项工作中使用带有 group_name 的表。这是我任务的不同部分,虽然类似的数据不适用于这里。我将尝试在下一条评论中添加我的代码。再次感谢。 我想我可以将我的表复制到一个名为 groups 的表中,并临时添加一个名为 group_name 的列,然后使用lead_tn 自动填充它,因为无论如何我们都可以互换使用它们。那么我应该可以按原样使用你的代码了。 通常最好的办法是发布与您的问题相关的示例数据 :) 我对您的表包含的内容有些迷茫,所以在我看到一些新数据之前我被卡住了。我不明白为什么您不能创建一个将组名表连接到该表的简单查询。如果可以创建新表,为什么不能创建查询?

以上是关于访问 2010 递归数据的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构] 树森林的遍历

将数据写入访问 2010 表单 VB 2010

xml文件的递归函数(分层数据)

数据结构-二叉树的遍历

Access 2010:拆分数据库后无法访问查询

具有递归数据结构的 Boost 序列化最终导致堆栈溢出