在单个SQL语句中按行比较BETWEEN比较

时间:2009-08-14 08:26:56

标签: 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_id integer
    CONSTRAINT fk_tree FOREIGN KEY (tree_id) REFERENCES tree (id) )

使用修改后的预订树遍历(MPTT)算法填充表lft上的列rgttree

是否可以将所有项目附加到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);

关键是我只能执行一个SQL语句(如果重要的话,在PostgreSQL数据库中)。你能用某种子查询做到这一点吗?

感谢任何提示。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

那么,如果您在将查询写入给定数据结构时遇到问题,或许您应该考虑使用其他一些数据结构?嵌套集(你在这里展示的内容)看起来很酷,但在向它们编写查询时是一个很大的痛苦。

也许您可以使用this之类的内容(披露:这是我博客上的帖子)。