In a UNION
query you can only sort by columns in the result. You need to sort by columns from the base tables, though.
Include the needed columns for sorting and drop them in a final outer SELECT
. Added some other improvements while being at it.
SELECT grp, name
FROM (
SELECT g1.group1 || '-' || g2.group2 AS grp
, g1.group1 || ' - ' || g2.group2 AS name
, g1.group1 , g2.group2 -- for sortting only
FROM group1 g1
JOIN items i USING (group1id)
JOIN group2 g2 USING (group2id)
UNION ALL
SELECT g1.group1 || '-' || g2.group2 || '-' || item AS grp
, item AS name
, g1.group1 , g2.group2 -- for sortting only
FROM group1 g1
JOIN items i USING (group1id)
JOIN group2 g2 USING (group2id)
) sub
ORDER BY group1, group2;
Since grp is used for order purpose only
, you can further simplify:
SELECT name
FROM (
SELECT g1.group1 || ' - ' || g2.group2 AS name
, g1.group1 , g2.group2
FROM group1 g1
JOIN items i USING (group1id)
JOIN group2 g2 USING (group2id)
UNION ALL
SELECT item AS name
, g1.group1 , g2.group2
FROM group1 g1
JOIN items i USING (group1id)
JOIN group2 g2 USING (group2id)
) sub
ORDER BY group1, group2