内连接,右连接?计算行数

Posted

技术标签:

【中文标题】内连接,右连接?计算行数【英文标题】: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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于内连接,右连接?计算行数的主要内容,如果未能解决你的问题,请参考以下文章

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)

Oracle_SQL 连接和子查询

MySQL 的内连接、左连接、右连接有啥区别?

SQL中的左连接与右连接,内连接有啥区别