I’ve a terrible memory. Whenever I do a CONNECT BY query in Oracle – and I do mean every time – I have to think hard and usually through trial and error work out on which argument the PRIOR should go.
I don’t know why I don’t remember – but I don’t.
Does anyone have a handy memory mnemonic so I always remember ?
For example:
To go down a tree from a node – obviously I had to look this up 🙂 – you do something like:
select * from node connect by prior node_id = parent_node_id start with node_id = 1
So – I start with a node_id of 1 (the top of the branch) and the query looks for all nodes where the parent_node_id = 1 and then iterates down to the bottom of the tree.
To go up the tree the prior goes on the parent:
select * from node connect by node_id = prior parent_node_id start with node_id = 10
So starting somewhere down a branch (node_id = 10 in this case) Oracle first gets all nodes where the parent_node_id is the same as the one for which node_id is 10.
EDIT: I still get this wrong so thought I’d add a clarifying edit to expand on the accepted answer – here’s how I remember it now:
select * from node connect by prior node_id = parent_node_id start with node_id = 1
The ‘english language’ version of this SQL I now read as…
In NODE, starting with the row in which
node_id = 1, the next row selected has itsparent_node_idequal tonode_idfrom the previous (prior) row.
EDIT: Quassnoi makes a great point – the order you write the SQL makes things a lot easier.
select * from node start with node_id = 1 connect by parent_node_id = prior node_id
This feels a lot clearer to me – the ‘start with’ gives the first row selected and the ‘connect by’ gives the next row(s) – in this case the children of node_id = 1.
Think about the order in which the records are going to be selected: the link-back column on each record must match the link-forward column on the PRIOR record selected.