单个SQL语句中的行间比较
鉴于下表:单个SQL语句中的行间比较,sql,postgresql,Sql,Postgresql,鉴于下表: CREATE TABLE tree ( id serial NOT NULL, name character varying NOT NULL, type integer, lft integer NOT NULL, rgt integer NOT NULL ) CREATE TABLE item ( id serial NOT NULL, name character varying NOT NULL, tree_i
CREATE TABLE tree (
id serial NOT NULL,
name character varying NOT NULL,
type integer,
lft integer NOT NULL,
rgt integer NOT NULL )
CREATE TABLE item (
id serial NOT NULL,
name character varying NOT NULL,
tree_id integer
CONSTRAINT fk_tree FOREIGN KEY (tree_id) REFERENCES tree (id) )
表树上的lft和rgt列是使用改进的前序树遍历MPTT算法填充的
是否可以在一个查询中获取所有附加到type=x的树节点的项目及其所有子节点
通常,我会在两个单独的查询中这样做:
SELECT lft, rgt FROM tree WHERE type = x;
/* assume it returns two rows: ((10, 20), (27, 30)) */
SELECT item.id, item.name FROM item JOIN tree ON (tree_id = tree.id)
WHERE ((lft >= 10 AND rgt <= 20) OR (lft >= 27 AND rgt <= 30);
关键是,如果重要的话,我只能在PostgreSQL数据库中执行一条SQL语句。你能用某种子查询来实现这一点吗
谢谢你的提示
SELECT item.*
FROM tree tm
JOIN tree tc
ON tc.lft >= tm.lft
AND tc.rgt <= tm.rgt
JOIN item
ON item.tree_id = tc.id
WHERE tm.type = x
您可能想考虑更容易管理的父子模型。
请参阅我博客中关于如何在PostgreSQL 8.3及以下版本中实现它的文章: ,并在PostgreSQL 8.4中:嗯,如果你对给定的数据结构写查询有问题,也许你应该考虑使用其他的数据结构?这里显示的嵌套集看起来很酷,但在向它们编写查询时却是一大难题
也许您可以使用类似“披露”的内容:这是我博客上的一篇文章。item.id和tree.id与存储为lft和rgt的MPTT值无关。树上表项的联接只能由foreign key.np完成,谢谢您的帮助。树模型必须针对读取性能进行优化,这就是选择MPTT模型的原因。“您的更新”答案正是我想要的。@Haes:请注意,现在您将树和项目视为不同的实体时,它远远不是最佳的。对两个不同列的范围查询效率非常低,即使使用位图和。在您的场景中,树同时具有子项和子树的情况是否真实?