【问题标题】:inner join, right join ? Count rows内连接,右连接?计算行数
【发布时间】:2016-09-26 12:16:45
【问题描述】:

如何发现哪些订单没有明细行?

表订单:orderId (int)、customerName、deliveryDate(日期)、价格(十进制)

表详细信息:detailId(int)、orderId(int)、sku(varchar)、quantity(int)

我试过了(没有成功):

SELECT
    COUNT(Details.detailId) AS Tot,
    Orders.orderId
FROM Details
INNER JOIN Orders
    ON Details.orderId = Orders.orderId
GROUP BY Details.orderId
HAVING Tot = 0

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    not innot exists 怎么样?

    select o.*
    from orders o
    where not exists (select 1
                      from details d
                      where d.orderId = o.orderId
                     );
    

    如果你不想要所有列,那么select 是你想要的那些在外部select

    【讨论】:

      【解决方案2】:

      尝试使用左外连接join。另见How to retrieve non-matching results in mysql

      INNER JOINS 从两个匹配的表中选择行。其他所有内容都将被丢弃,并且在您可以使用 HAVING 查询的结果集中不可用

      LEFT OUTER JOINS为左表(订单)中的每个条目选择一行。始终为正确的表生成一行(详细信息)。如果找不到匹配的行,则值将为 NULL。我们可以利用这一点,尝试:

      SELECT Orders.orderId, Details.orderId
      FROM Orders
      LEFT OUTER JOIN Details              -- generate a row for every row in a
                                           -- make null if not matching
      ON Details.orderId = Orders.orderId  -- match condition
      WHERE Details.orderId IS NULL
      

      【讨论】:

        【解决方案3】:

        使用外部连接选择它并检查 orderId 是否为空...像这样

        SELECT
            o.*
        FROM orders o
        LEFT OUTER JOIN details d
            ON d.orderId = o.orderId
        WHERE d.orderId IS NULL
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-05
          • 2015-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多