内连接,右连接?计算行数
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 in
或 not 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
【讨论】:
以上是关于内连接,右连接?计算行数的主要内容,如果未能解决你的问题,请参考以下文章