检查以下表格中的记录是否有某种关系是有用的:
-- Table: privilege_group
CREATE TABLE privilege_group (
privilege_group_id integer NOT NULL CONSTRAINT privilege_group_pk PRIMARY KEY AUTOINCREMENT,
name text NOT NULL,
CONSTRAINT privilege_group_name UNIQUE (name)
);
-- Table: privilege_relationship
CREATE TABLE privilege_relationship (
privilege_relationship_id integer NOT NULL CONSTRAINT privilege_relationship_pk PRIMARY KEY AUTOINCREMENT,
parent_id integer NOT NULL,
child_id integer NOT NULL,
CONSTRAINT privilege_relationship_parent_child UNIQUE (parent_id, child_id),
CONSTRAINT privilege_relationship_parent_id FOREIGN KEY (parent_id)
REFERENCES privilege_group (privilege_group_id),
CONSTRAINT privilege_relationship_child_id FOREIGN KEY (child_id)
REFERENCES privilege_group (privilege_group_id),
CONSTRAINT privilege_relationship_check CHECK (parent_id != child_id)
);
父母可以有很多孩子,孩子可以有很多父母。编写代码来处理数据库之外的记录总是可行的,但是可以使用深度优先(或广度优先)搜索来检查孩子是否有特定的父级吗?
My related question收到CL.提及WITH clause的评论,但我对分层查询的体验相当有限,不足以理解,选择和应用页面上的示例我的目标:
有人可以告诉我如何知道孩子是否有父母的名字吗?
答案 0 :(得分:1)
这是一个标准的树搜索(使用UNION而不是UNION ALL来防止无限循环):
CREATE TABLE IF NOT EXISTS table (
date date,
`voltage(V)` decimal (2,2)
)
深度/广度优先与此无关。
答案 1 :(得分:0)
CL.'s answer的替代方法可能是此查询已被重新格式化并调整为使用可插入需要检查某些关系的项目的绑定参数:
WITH RECURSIVE parent_of_child(id)
AS (
SELECT privilege_group_id
FROM privilege_group
WHERE name = :child
UNION
SELECT parent_id
FROM privilege_relationship
JOIN parent_of_child
ON id = child_id)
SELECT id
FROM parent_of_child
WHERE id = (
SELECT privilege_group_id
FROM privilege_group
WHERE name = :parent)