Folks,

Given the following tables:

--DROP TABLE teams_desc;
create table teams_desc (
        teams_id INT4 NOT NULL DEFAULT NEXTVAL('users_user_id_sq') PRIMARY KEY,
        teams_name VARCHAR(75) NOT NULL,
        teams_code VARCHAR(20) NOT NULL,
        notes TEXT NULL );

--drop table teams_tree;
create table teams_tree (
        teams_id INT4 NOT NULL REFERENCES teams_desc(teams_id) ON DELETE CASCADE,
        treeno INT4 NOT NULL,
        constraint pk_teams_tree PRIMARY KEY (teams_id, treeno)
        );

--drop table teams_users;
create table teams_users  (
        teams_id INT4 NOT NULL REFERENCES teams_desc(teams_id) ON DELETE CASCADE,
        user_id INT4 NOT NULL REFERENCES users(user_id) ON DELETE CASCADE,
        leader BOOLEAN NOT NULL DEFAULT FALSE,
        constraint teams_users_pk PRIMARY KEY ( teams_id, user_id )
);

drop view teams;
create view teams as
select teams_id, teams_name, teams_code, notes,
        min(treeno) as lnode, max(treeno) as rnode
from teams_desc JOIN teams_tree USING (teams_id)
group by teams_id, teams_name, teams_code, notes;


I need to construct a query that will delete all duplicate users within a tree 
barnch, leaving only the user references which are "lowest" on the tree.  The 
best I've been able to come up with is:

v_left := current branch left node
v_right := current branch right node

DELETE FROM teams_users
WHERE EXISTS (SELECT teams.team_id
FROM teams JOIN teams_users tu2 USING (team_id)
        WHERE EXISTS (SELECT MAX(tm.lnode), MIN(tm.lnode), user_id
                FROM teams_users tu JOIN teams tm USING (team_id)
                WHERE ((tm.lnode > v_left and tm.rnode < v_right)
                        OR (tm.lnode < v_left AND tm.rnode > v_right))
                GROUP BY user_id
                HAVING MIN(tm.lnode) < MAX(tm.lnode) AND
                        tu.user_id = tu2.user_id
                        AND MAX(tm.lnode) > teams.lnode)
        AND teams_users.team_id = tu2.team_id and teams_users.user_id = tu2.user_id);

But that's a nested WHERE EXISTS clause, with an aggregate referenceing the 
same aggregated view twice.   It seems like there must be a more efficient 
way to build this query, but I can't think of one.  Suggestions?

-Josh Berkus

P.S. This is based on Joe Celko's Linear Nested Model of tree construction.






---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to