如何在 SQL 中连接 2 个没有关系的表

How to join 2 tables without relationship in SQL

我正在努力将三个 table 与外部连接结合起来,但无法正确处理 我正在使用 PostgreSQL 数据库.. 我的 table 看起来像这样:

我的订单table有客户和年份的外键(这两个没有任何关系) 某年和客户未出现在我的订单中 table 我正在尝试进行 sql 查询,以便每个客户全年都有。我可以通过交叉连接客户和年份来获得此结果,但是当我继续将此结果与其他 table 连接时,这种方法不起作用。 (我的订单 table 还有其他外键,我也必须加入)那么我可以通过使用外部联接来获得这个结果吗?

我试过:

Select* From Orders
RIGHT JOIN Customers on Orders.customer_id = customer.id

这给了我订单中的所有客户 table(即使他们没有订单)然后我想对所有年份都做同样的事情所以每个客户每年都有一行(2015 年) -2020) 已尝试在 table 年内进行另一个右连接,但它没有用。有人知道如何解决这个问题吗?

p.s table 的名字不是真实的,我只是用这个名字让它更容易理解!

A​​ CROSS JOIN 的客户和年份,然后 LEFT JOIN 的订单似乎完全符合您在 post 中描述的内容。还是我弄错了什么?

并且下次不要将您的数据放入图像中。只需将它输入/粘贴到您的 post 中,这样我们就可以 copy-paste 它到我们的示例中......我不得不 re-type 他们......

并且“姓名”和“年份”是保留字。我在示例中避免了它们。

\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

如果您希望所有客户都有一年和他们各自的订单(如果他们每年都有)。

SELECT CUS.ID AS CustomerID, CUS.Name AS CustomerName, YEA.year AS Year, ORD.ID AS OrderID 
FROM Customers AS CUS
   CROSS JOIN Years AS YEA
   LEFT JOIN Orders AS ORD 
        ON CUS.ID = ORD.Customer_ID
        AND ORD.YEAR_ID = YEA.ID;

这会将您和他们的订单作为单独的行显示。 如果您想要订单数量,请改用:

SELECT CUS.ID AS CustomerID, CUS.Name AS CustomerName, YEA.year AS Year, Count(ORD.ID) AS NrOfOrders 
FROM Customers AS CUS
   CROSS JOIN Years AS YEA
   LEFT JOIN Orders AS ORD 
        ON CUS.ID = ORD.Customer_ID
        AND ORD.YEAR_ID = YEA.ID
GROUP BY CUS.ID, CUS.Name, YEA.Year;

这将显示订单数量并每年为每个客户提供一行。

试试看 out/see 实际操作 here,我添加了一些数据来显示多个订单。