Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一个表中链接行是一种错误的模式吗?_Sql_Sqlite - Fatal编程技术网

Sql 在同一个表中链接行是一种错误的模式吗?

Sql 在同一个表中链接行是一种错误的模式吗?,sql,sqlite,Sql,Sqlite,我想创建一个目录树结构,并需要找到一种合适的方法将其存储到数据库中。想想下面的动物树,它非常准确地描述了它应该是什么样子: 我现在的问题是,将这些条目链接到同一个表中是否是一个好主意。SQLite不允许我向同一个表中的值添加外键约束,因此我必须手动确保不会造成不一致。这就是我目前的计划: id | parent | name ---+--------+-------- 1 | null | Animal 2 | 1 | Reptile 3 | 2 | Lizard

我想创建一个目录树结构,并需要找到一种合适的方法将其存储到数据库中。想想下面的动物树,它非常准确地描述了它应该是什么样子:

我现在的问题是,将这些条目链接到同一个表中是否是一个好主意。SQLite不允许我向同一个表中的值添加外键约束,因此我必须手动确保不会造成不一致。这就是我目前的计划:

id | parent | name
---+--------+--------
 1 | null   | Animal
 2 | 1      | Reptile
 3 | 2      | Lizard
 4 | 1      | Mammal
 5 | 4      | Equine
 6 | 4      | Bovine

parent
引用同一个表中的
id
,一直向上,直到找到
null
,它是根。这是一个坏模式吗?如果是这样,将树结构放入关系数据库的常见替代方案是什么?

如果您的SQLite版本支持递归CTE,那么这是一个选项:

WITH RECURSIVE cte (n) AS (
    SELECT id FROM yourTable WHERE parent IS NULL
    UNION ALL
    SELECT t1.id
    FROM yourTable t1
    INNER JOIN cte t2
        ON t1.parent = t2.n AND t1.name NOT LIKE '%Lizard%'
)

SELECT *
FROM yourTable
WHERE id IN cte;

这是未经测试的,但是在上述CTE的递归部分中对
t1.name
的检查(希望如此)应该在我们到达与
LIKE
表达式中的名称匹配的记录时停止递归。在搜索
Lizard
的情况下,递归应该停止在Lizard之上一个级别,这意味着应该返回层次结构中它之上的所有记录。

您的表是一个递归层次结构,在SQL中非常常见。当您想要查询表以得到某些问题的答案时,技巧就来了。在这里,您是否有特定的查询/要求?是的,我想使用
一样搜索特定的单词,然后查找搜索结果的所有父类别。您使用的是哪个版本的SQLite?最新版本使用的是SQLiteStudio。
t2.n
,而不是
t2.id
。不幸的是,它无法工作。它只返回一个空查询。谢谢你的提示,我将进一步研究这个递归函数。没关系,我忘了更改一个表名。它就像一个符咒。非常感谢。