I want to run two queries that are pretty similar such that the query returns one table with two columns (one column for each query ran)
Query #1:
SELECT groupID FROM tbl WHERE username = 'admin' AND permission LIKE 'sample.%'
Query #2:
SELECT groupID FROM tbl WHERE username = 'administrator' AND permission LIKE 'sample.%'
Desired return:
admin | administrator |
---|---|
groupID.1 | groupID.1 |
groupID.3 | groupID.2 |
Is it possible? I was able to get the expected return by doing a FULL OUTER JOIN but I read that JOINS are between two tables and this only looks at one table.
Advertisement
Answer
You could try assigning a row number first to each row of each table, then match the two table on this ranking:
WITH cte_admin AS ( SELECT groupID, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn FROM tbl1 ), cte_administrator AS ( SELECT groupID, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn FROM tbl2 ) SELECT t1.groupID AS g1, t2.groupID AS g2 FROM cte_admin t1 INNER JOIN cte_administrator t2 ON t1.rn = t2.rn UNION SELECT t1.groupID AS g1, t2.groupID AS g2 FROM cte_admin t1 LEFT JOIN cte_administrator t2 ON t1.rn = t2.rn WHERE t2.rn IS NULL UNION SELECT t1.groupID AS g1, t2.groupID AS g2 FROM cte_administrator t1 LEFT JOIN cte_admin t2 ON t1.rn = t2.rn WHERE t2.rn IS NULL
A fully tested solution will be provided if you can share contents from the table tbl
.
For the full outer join, three joins are needed:
INNER JOIN
to match corresponding row numbers between the two tablesLEFT JOIN from table1 to table2 WHERE table2 is null
to match excess rows from table1 in case this has more rows than table2LEFT JOIN from table2 to table1 WHERE table1 is null
to match excess rows from table2 in case this has more rows than table1
A pseudo test is done here.