【问题标题】:SQL statement to get all customers with no ordersSQL语句获取所有没有订单的客户
【发布时间】:2011-04-21 01:37:57
【问题描述】:

我有一个典型的 Persons 表和一个 Orders 表,以这样一种方式定义,我可以按照以下方式进行 JOIN 查询以返回所有 Persons 的 Orders。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.id=Orders.Person_id

问题是,我如何编写一个语句来返回所有没有订单的人?

我正在使用 mysql。

提前谢谢大家。

【问题讨论】:

    标签: sql mysql join


    【解决方案1】:

    您可能想使用LEFT JOINIS NULL

    SELECT     Persons.LastName, Persons.FirstName
    FROM       Persons
    LEFT JOIN  Orders ON Persons.id = Orders.Person_id
    WHERE      Orders.Person_id IS NULL;
    

    左连接的结果总是包含“左”表(Persons)的所有记录,即使连接条件在“右”表(Orders)中没有找到任何匹配的记录。当没有匹配时,“右”表的列将在结果集中NULL

    【讨论】:

      【解决方案2】:

      这应该可行...有不止一种方法可以做到这一点。

      select * from persons where person.id not in (select person_id from orders)
      

      【讨论】:

      • 这确实可行,但对于大型记录集来说可能会变得非常低效,因为它首先获取所有订单,然后使用外部查询对其进行过滤。加入答案确实是最好的方法。
      • 哇。这比 LEFT JOIN 解决方案快得多——在我的服务器上为 0.08 秒,而 22 秒!还在 PHPMyAdmin 中提供了编辑/复制/删除选项,而其他选项则没有。谢谢,大卫!
      • 为我工作。谢谢。
      【解决方案3】:

      为了完整起见,这里是not exists 版本:

      select * from persons p 
      where not exists
      (select null from orders o where o.person_id = p.id)
      

      【讨论】:

      • 所有三个答案都如我所愿。谢谢大家。
      【解决方案4】:

      你可以使用左连接:

          SELECT DISTINCT o.CustomerID from Orders as o
          left join Customers as c
          on o.CustomerID=c.CustomerID
      

      【讨论】:

        猜你喜欢
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2011-08-21
        • 2018-06-07
        相关资源
        最近更新 更多