CROSS JOIN 的客户和年份,然后是 LEFT JOIN 的订单似乎与您在帖子中描述的完全一样。还是我搞错了?
并且下次不要将您的数据放入图像中。只需将其输入/粘贴到您的帖子中,这样我们就可以将其复制粘贴到我们的示例中...我不得不重新输入它们...
并且“名称”和“年份”是保留字。我在我的例子中避开了它们。
\pset null NULL
WITH
-- your input ...
customers ( id, nm) AS (
SELECT 1,'alpha'
UNION ALL SELECT 2,'bravo'
UNION ALL SELECT 3,'charlie'
UNION ALL SELECT 4,'delta'
UNION ALL SELECT 5,'echo'
UNION ALL SELECT 6,'foxtrot'
)
,
years(id,yr) AS (
SELECT 1,2015
UNION ALL SELECT 2,2016
UNION ALL SELECT 3,2017
UNION ALL SELECT 4,2018
UNION ALL SELECT 5,2019
UNION ALL SELECT 6,2020
)
,
orders(id,cust_id,yr_id) AS (
SELECT 1,1,1
UNION ALL SELECT 2,2,3
UNION ALL SELECT 3,4,5
UNION ALL SELECT 4,5,6
)
-- end of your input ...
SELECT
cust.nm
, years.yr
, ord.id
FROM customers cust
CROSS JOIN years
LEFT JOIN orders ord ON ord.yr_id=years.id
ORDER BY 1,2
;
-- out nm | yr | id
-- out ---------+------+------
-- out alpha | 2015 | 1
-- out alpha | 2016 | NULL
-- out alpha | 2017 | 2
-- out alpha | 2018 | NULL
-- out alpha | 2019 | 3
-- out alpha | 2020 | 4
-- out bravo | 2015 | 1
-- out bravo | 2016 | NULL
-- out bravo | 2017 | 2
-- out bravo | 2018 | NULL
-- out bravo | 2019 | 3
-- out bravo | 2020 | 4
-- out charlie | 2015 | 1
-- out charlie | 2016 | NULL
-- out charlie | 2017 | 2
-- out charlie | 2018 | NULL
-- out charlie | 2019 | 3
-- out charlie | 2020 | 4
-- out delta | 2015 | 1
-- out delta | 2016 | NULL
-- out delta | 2017 | 2
-- out delta | 2018 | NULL
-- out delta | 2019 | 3
-- out delta | 2020 | 4
-- out echo | 2015 | 1
-- out echo | 2016 | NULL
-- out echo | 2017 | 2
-- out echo | 2018 | NULL
-- out echo | 2019 | 3
-- out echo | 2020 | 4
-- out foxtrot | 2015 | 1
-- out foxtrot | 2016 | NULL
-- out foxtrot | 2017 | 2
-- out foxtrot | 2018 | NULL
-- out foxtrot | 2019 | 3
-- out foxtrot | 2020 | 4