AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[hierarchy](dba)

Martin Hope
manoelpqueiroz
Asked: 2020-08-27 09:12:57 +0800 CST

聚合具有字段约束的嵌套集模型

  • 0

我有一个建立在嵌套集模型上的表,它基本上记录了不同性质的事务(由字段定义idx):

pk  lft rgt idx             value
 1   1  30  2783     20402.710000
 2   2   3  2783    -13885.670000
 3   4   5   131        78.547946
 4   6   7  2783      -586.810000
 5   8   9     1         0.013421
 6  10  11  2783     -1777.630000
 7  12  13   873     10791.237266
 8  14  15  2783       -72.510000
 9  16  17  1697       128.626280
10  18  19  2783      -600.430000
11  20  21  1168         6.949175
12  22  23  2783     -2479.080000
13  24  25  1758       853.502787
14  26  27  2783     -1000.580000
15  28  29  3794      3172.428304
16  31  40  2783       615.940000
17  32  33  2783      -615.940000
18  34  39     1         0.040390
19  35  36     1        -0.000152
20  37  38     1        -0.000300
21  41  42  2783      3012.050000

嵌套集中表示的三个

由于这些事务以特定方式嵌套,其中子节点的性质可能与其父节点的性质不同(在此过程中代表一种“转换”),我很难为每个父节点获取“余额”节点本身的性质:

prnt_pk      idx            aggr
1           2783        0.000000
3            131       78.547946
5              1        0.013421
7            873    10791.237266
9           1697      128.626280
11          1168        6.949175
13          1758      853.502787
15          3794     3172.428304
16          2783        0.000000
18             1        0.039938
21          2783     3012.050000

给定原始表格,我怎样才能实现这个期望的输出?我已经尝试按照这个问题中描述的方式做一些事情,但是我设法得到的只是一个父节点及其所有具有相同的子节点,idx在我的情况下我可以更轻松地完成SELECT * FROM table WHERE idx = 2783或类似。

如果有帮助,每个父节点都有一个正值,不允许有负值的节点有子节点。

sqlite hierarchy
  • 1 个回答
  • 33 Views
Martin Hope
Jacob Stamm
Asked: 2020-01-30 09:17:48 +0800 CST

将分层数据从一个表复制到另一个表的模式?

  • 0

想象一个包含三列的表:一个 ID 主键、一个可以为空的 ParentID 引用同一表上的 ID 列,以及一个 TreeID 来指示组成特定树的记录。一个基本的层次结构可能看起来像这样。请注意,序数值不一定会影响记录在层次结构中的位置。

      dbo.TreeNodes             Visual representation:
+----+----------+--------+    --------------------------
| ID | ParentID | TreeID |       Tree 7:     Tree 15:
+----+----------+--------+       1           10
|  1 | NULL     |      7 |       |–3         |–9
|  2 | 4        |      7 |       |–4
|  3 | 1        |      7 |       |–|–2
|  4 | 1        |      7 |       |-5
|  5 | 1        |      7 |
|  9 | 10       |     15 |
| 10 | NULL     |     15 |
+----+----------+--------+

给定另一个具有相同定义的不相关表(dbo.TreeNodes2假设为 ),我发现将数据从第一个表复制到第二个表同时保持其自引用层次结构并不是那么简单。当需要填充 ParentID 值时,我在插入新的 dbo.TreeNodes2 记录后卡住了。我必须有某种映射表才能知道第一个表中的哪些记录映射到第二个表中的新记录。这是我到目前为止所得到的:

DECLARE @TreeID INT = 7;
-- hard code arbitrary TreeID value for the 2nd table for the sake of demo
DECLARE @NewTreeID INT = 42;

CREATE TABLE #InsertedRows
(
    ID INT NOT NULL PRIMARY KEY
);

INSERT INTO dbo.TreeNodes2
(
    ParentID,
    TreeID
)
OUTPUT Inserted.ID INTO #InsertedRows
SELECT
    NULL, -- ParentID can't be added yet because the IDs don't yet exist.
          -- They need to be updated in later.
    @NewTreeID
FROM dbo.TreeNodes AS tn1
WHERE tn1.TreeID = @TreeID;

我可以向 dbo.TreeNodes2添加一个不相关的OldID列以将原始 ID 复制到其中,然后我可以使用它来创建一个映射以加入并填充新的 ParentID 记录,然后OldID在完成后将所有值清空,但这似乎是糟糕的设计。如果 SQL Server 允许 INSERT 的 OUTPUT 子句包含来自连接的列,那么这很容易,但是所有文档以及我自己的测试都表明只有Inserted.*列、Deleted.*列和标量值/文字可以是在 OUTPUT 子句中使用。什么都没有加入。

我的梦想,执行我想要的非有效 T-SQL 看起来像这样:

CREATE TABLE #InsertedRows
(
    ID INT NOT NULL PRIMARY KEY,
    OldID INT NOT NULL
);

INSERT INTO dbo.TreeNodes2
(
    ParentID,
    TreeID
)
OUTPUT Inserted.ID, tn1.ID INTO #InsertedRows (ID, OldID)
SELECT
    NULL, -- ParentID can't be added yet because the IDs don't yet exist.
          -- They need to be updated in later.
    @NewTreeID
FROM dbo.TreeNodes AS tn1
WHERE tn1.TreeID = @TreeID;

从这里,我将有一个映射表,我可以使用它来填充新表中的 ParentID 值。

是否有一种模式可以处理这些类型的跨表分层插入,而不依赖于唯一目的是允许迁移的额外列,之后它是一个不相关的列?

sql-server hierarchy
  • 1 个回答
  • 490 Views
Martin Hope
Cristiano Lagame
Asked: 2019-05-01 09:21:34 +0800 CST

如何递归地从孩子id中选择父亲的id

  • 2

我在字段 cod_categorizacao_pai 中有父亲的 ID,我需要安装一个只输入一个 ID 的选择,它会列出这个 ID 的父亲 ID,直到它到达所有的父 ID。我如何设置一个选择来做到这一点?我需要一个程序吗?我正在使用 PL/SQL。

桌子:

CREATE TABLE [dbo].[menu]
(
  id INT PRIMARY KEY
, name NVARCHAR(20)
, parent_id INT REFERENCES [dbo].[menu] ([id])
);

假设我正在使用以下记录:

INSERT INTO menu VALUES (1,'Main Product',NULL); 
INSERT INTO menu VALUES (2,'Next Main Product',NULL); 
INSERT INTO menu VALUES (3,'Addon Product',1); 
INSERT INTO menu VALUES (4,'Addon Product',1); 
INSERT INTO menu VALUES (5,'Sub-Addon Product',3);
INSERT INTO menu VALUES (6,'Sub-sub-Addon Product',5);
INSERT INTO menu VALUES (7,'Addon Next Main Product',2);

如果我将 ID“6”作为参数传递,我希望得到以下列表:1,3,5,6

oracle hierarchy
  • 1 个回答
  • 145 Views
Martin Hope
user148246
Asked: 2018-04-26 13:14:31 +0800 CST

从 3 个分层表中获取所有后代

  • 3

我在数据库中有下表:

+-------------+   +-------------+-------------+   +---------------------------+
|  project1   |   |          project2         +   |         project3          |
+-------------+   +-------------+-------------+   +---------------------------+
| project1_id |   | project2_id | project1_id |   | project3_id | project2_id |
+-------------+   +-------------+-------------+   +---------------------------+
|    hnc1     |   |    hnc4     |     hnc1    |   |     hnc7    |    hnc4     |
|    hnc2     |   |    hnc5     |     hnc1    |   |     hnc8    |    hnc4     |
|    hnc3     |   |    hnc6     |     hnc3    |   |     hnc9    |    hnc6     |
+-------------+   +-------------+-------------+   +---------------------------+

我需要从所有三个表中检索给定 ID 的所有后代 - 如果在任何表中找到 ID 本身,也包括在内。

例如,如果我使用 ID “hnc4”进行查询,它应该得到:

+-------------+
| descendants |
+-------------+
|    hnc7     |
|    hnc8     |
|    hnc4     |
+-------------+

如果我使用 ID 'hnc1'进行查询:

+-------------+
| descendants |
+-------------+
|    hnc4     |
|    hnc5     |
|    hnc7     |
|    hnc8     |
|    hnc1     |
+-------------+

即使 ID 仅在最后一个表中,查询也必须有效project3。

我正在搜索并发现递归 CTE 可能很有用,但我不知道如何使用 3 个表来实现它。

关于如何获得正确结果的任何指导?

postgresql hierarchy
  • 2 个回答
  • 698 Views
Martin Hope
Ophidian
Asked: 2018-03-29 05:05:14 +0800 CST

可空的依赖属性

  • 3

我正在为学生设计一个数据库。瑞士的计算机科学专业的学生可以在不同的专业之间做出选择,例如应用程序开发、系统工程等。

本申请中也有来自其他专业的学生,​​他们没有这个专业。几个例子:

+--------------------+-------------------------+
| Profession         | Specialization          |
+--------------------+-------------------------+
| Computer scientist |                         |
|                    | Application development |
|                    | System engineering      |
|                    | Support                 |
|                    |                         |
| Electrician        |                         |
|                    | none                    |
|                    |                         |
| Janitor            |                         |
|                    | none                    |
|                    |                         |
| Architect          |                         |
|                    | Small buildings         |
|                    | High buildings          |
|                    |                         |
+--------------------+-------------------------+

我希望你明白了。我现在的问题是,我该如何设计具有这些属性的数据库表,因为它们相互依赖?每个用户都有自己的职业,有些用户根据自己的职业没有专业化。所以电工不应该是应用程序开发人员,也不应该是架构师。

到目前为止我的想法 1

+-----------------------------+
| User                        |
+-----------------------------+
| #id                         |
| profession_id               |
| specialisazion_id, nullable |
+-----------------------------+

通过约束检查执行逻辑

方法二

+-------------------+     +----------------+     +------------+
| User              |     | Specialization |     | Profession |
+-------------------+     +----------------+     +------------+
| #id               |  +--| #id            |  +--| #id        |
| username          |  |  | name           |  |  | name       |
| specialization_id |--+  | profession_id  |--+  +------------+
+-------------------+     +----------------+

自己管理逻辑并确保每个没有专业化的职业都有一个专业化条目。

方法三

+----------------+     +-----------------------------+     +------------+
| Specialization |     | spec_prof                   |     | Profession |
+----------------+     +-----------------------------+     +------------+
| #id            |--+  | #id                         |  +--| #id        |
| name           |  +--| specialization_id, nullable |  |  | name       |
+----------------+     | profession_id               |--+  +------------+
                       +-----------------------------+
                                                |
                                                |                                         
                              +--------------+  |
                              | User         |  |
                              +--------------+  |
                              | #id          |  |
                              | username     |  |
                              | spec_prof_id |--+
                              +--------------+

不知何故,所有不同的方法都让人觉得笨拙、肮脏。支持和反对不同方法的论据是什么?有没有更好的办法?

我什至如何搜索这个问题?dependent命名正确吗?

任何帮助是极大的赞赏。

database-design hierarchy
  • 2 个回答
  • 71 Views
Martin Hope
giannis christofakis
Asked: 2018-03-23 00:36:47 +0800 CST

WHERE 中的条件与 CONNECT BY 中的条件

  • 5

谁能向我解释以下两个查询之间的区别?尽管它们看起来相同,但结果却不同。

select concept.concept_id, concept.PARENT_ID 
from ebti_thes_concept_v concept
  start with PARENT_ID = '11025'
  connect by parent_id = prior concept_id
  and exists (..) 

在第二个中,exists谓词从connect by子句移动到where子句。

select concept.concept_id, concept.PARENT_ID
from ebti_thes_concept_v concept
where exists (..)
 start with PARENT_ID = '11025'
 connect by parent_id = prior concept_id;
oracle hierarchy
  • 1 个回答
  • 3049 Views
Martin Hope
Jan Gassen
Asked: 2018-03-03 06:23:29 +0800 CST

根据 MySQL 中的给定条件选择层次结构中最顶层的文件夹

  • 1

我正在使用 MySQL (5.7.20) 来存储文件夹层次结构。每个文件夹都与所有直接和间接父项一起存储,包括距离。例如,以下文件夹

A
+- B
   + C
   + D

会像这样存储:

parent | child | dist
-------+-------+-----
A      | A     | 0
A      | B     | 1
A      | C     | 2
A      | D     | 2
B      | B     | 0
B      | C     | 1
B      | D     | 1
C      | C     | 0
D      | D     | 0

此外,还有另一个表将文件夹链接到一个或多个用户,如下所示:

child | user
------+-----
A     | U1
B     | U1
C     | U2
D     | U2

我现在想要实现的是通过用户以仅返回层次结构中最高匹配的方式查询此层次结构。

因此,如上例所示,如果我查询用户的文件夹U1,我只想要A结果,因为第二个匹配B项是A. 另一方面,如果我查询 user 的文件夹U2,结果应该是C, D因为两个文件夹都在同一层次结构级别。

我能想到的最接近的查询是,SELECT child, dist AS d FROM folders JOIN users ON folders.child = users.child GROUP BY folders.parent HAVING d = min(d);但不幸的是它没有给出正确的结果,例如,对用户的查询U1仍然会给出文件夹A,B。

有谁知道如何做到这一点?

mysql hierarchy
  • 1 个回答
  • 169 Views
Martin Hope
akkarin
Asked: 2017-10-25 04:22:53 +0800 CST

为什么 Oracle 在此分层查询中每行产生多个级别?

  • 0

我正在尝试重现本教程中的第一个简单示例。

但是,我不明白为什么我会返回这么多行。我希望 1 仅在 1 级而不是 2 级向 2 报告。

SQL> select employee_id, reports_to from employees;

EMPLOYEE_ID REPORTS_TO
----------- ----------
      1      2
      2
      3      2
      4      2
      5      2
      6      5
      7      5
      8      2
      9      5

9 rows selected.

SQL> select employee_id, reports_to, LEVEL from employees connect by prior employee_id = reports_to;

EMPLOYEE_ID REPORTS_TO      LEVEL
----------- ---------- ----------
      1      2      1
      8      2      1
      5      2      1
      6      5      2
      9      5      2
      7      5      2
      4      2      1
      3      2      1
      6      5      1
      9      5      1
      7      5      1

EMPLOYEE_ID REPORTS_TO      LEVEL
----------- ---------- ----------
      2         1
      1      2      2
      8      2      2
      5      2      2
      6      5      3
      9      5      3
      7      5      3
      4      2      2
      3      2      2

20 rows selected.
oracle hierarchy
  • 1 个回答
  • 473 Views
Martin Hope
user32421
Asked: 2016-12-14 08:34:20 +0800 CST

MySQL父/子表不显示父条目

  • 3

我有一张表,其中列出了类别,每个产品都可以属于或不属于父类别。只有一层可能的深度。

CREATE TABLE `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `parent` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
);

然后我插入一些记录:

INSERT INTO `categories` (`id`, `name`, `parent`) VALUES
(1, 'Cat 1',    NULL),
(2, 'Cat 2',    NULL),
(3, 'Cat 3',    NULL),
(4, 'Subcat 2.1',   2),
(5, 'Subcat 2.2',   2);

现在我想得到一个列表,其中包括所有类别和子类别,按主类别和下面的子类别排序,如下所示:

Cat 1
Cat 2
Subcat 2.1
Subcat 2.2
Cat 3

当我尝试以下它几乎可以工作,但它不会返回“Cat 2”的记录,只有孩子。

SELECT e.name AS parent_name, e.id AS parent_id, r.id AS child_id, r.name AS child_name
     FROM categories e
LEFT JOIN categories r ON e.id = r.parent
    WHERE e.parent IS NULL 
 ORDER BY parent_name, child_name

结果:

Cat 1   1   NULL    NULL
Cat 2   2   4   Subcat 2.1
Cat 2   2   5   Subcat 2.2
Cat 3   3   NULL    NULL

如何让它返回所有 5 条记录,包括“Cat 2”父类别?

mysql hierarchy
  • 1 个回答
  • 4357 Views
Martin Hope
Lachlan Brown
Asked: 2016-09-07 19:39:09 +0800 CST

如何正确创建具有多列的表自引用另一行?

  • 1
EmpNo |名称| 报告给 | 房间
10 | 导演 | 空 | 1个
20 | 高级经理 | 10 | 2个
30 | 打字员 | 20 | (这个人指的是 empno 10 房间)
40 | 程序员 | 30 | 4个

我如何正确地使 EmpNo 30 的房间指他老板的房间,而不是让 EmpNo 40 指他老板的房间?

hierarchy
  • 2 个回答
  • 62 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve