如何在 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,我添加了一些数据来显示多个订单。
我正在努力将三个 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,我添加了一些数据来显示多个订单。