单个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:请注意,现在您将树和项目视为不同的实体时,它远远不是最佳的。对两个不同列的范围查询效率非常低,即使使用位图和。在您的场景中,树同时具有子项和子树的情况是否真实?