Here is the code:
CREATE TABLE audit_trail (
old_email TEXT NOT NULL,
new_email TEXT NOT NULL
);
INSERT INTO audit_trail(old_email, new_email)
VALUES ('[email protected]', '[email protected]'),
('[email protected]', '[email protected]'),
('[email protected]', '[email protected]'),
('[email protected]', '[email protected]'),
('[email protected]', '[email protected]');
WITH RECURSIVE all_emails AS (
SELECT old_email, new_email
FROM audit_trail
WHERE old_email = '[email protected]'
UNION
SELECT at.old_email, at.new_email
FROM audit_trail at
JOIN all_emails a
ON (at.old_email = a.new_email)
)
SELECT * FROM all_emails;
old_email | new_email
--------------------------+--------------------------
[email protected] | [email protected]
[email protected] | [email protected]
[email protected] | [email protected]
(3 rows)
select old_email, new_email into iter1
from audit_trail where old_email = '[email protected]';
select * from iter1;
-- old_email | new_email
-- ----------------------+----------------------
-- [email protected] | [email protected]
-- (1 row)
select a.old_email, a.new_email into iter2
from audit_trail a join iter1 b on (a.old_email = b.new_email);
select * from iter2;
-- old_email | new_email
-- ----------------------+--------------------------
-- [email protected] | [email protected]
-- (1 row)
select * from iter1 union select * from iter2;
-- old_email | new_email
-- ----------------------+--------------------------
-- [email protected] | [email protected]
-- [email protected] | [email protected]
-- (2 rows)
As you can see the recursive code gives the result in right order, but the non-recursive code does not.
They both use union
, why the difference?