【问题标题】:How to join 2 tables without relationship in SQL如何在SQL中加入2个没有关系的表
【发布时间】:2020-12-25 17:25:12
【问题描述】:

我正在努力将三个表与外部联接结合起来,但无法正确处理 我正在使用 PostgreSQL 数据库.. 我的表格如下所示:

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

我试过了:

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

这给了我订单表中的所有客户(即使他们没有订单)然后我也想对所有年份都做同样的事情,所以每个客户每年都有一行(2015-2020)用年表做另一个正确的加入,但它不起作用..有人知道如何解决这个问题吗?

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

【问题讨论】:

    标签: sql postgresql outer-join


    【解决方案1】:

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

    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;
    

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

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

    【讨论】:

    • 谢谢 D 克莱默,这很好用。我没有添加这个:“AND ORD.YEAR_ID = YEA.ID”,当我之前进行交叉连接时,这是我的问题的解决方案:-)
    【解决方案2】:

    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
    

    【讨论】:

    • 感谢输入 marcothesane,我之前尝试过时忘记在交叉连接中添加一行。现在它奏效了。将按照您下次指出的方式添加数据,可以看看这如何制作更多场景:-)
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多