带子查询的外连接会更改mysql中的行数

时间:2016-07-15 08:11:25

标签: hiveql

SELECT COUNT(1)
FROM erp.cir_order
LEFT JOIN
(
    SELECT increment_id
    FROM magento.sales_flat_order sfo
    JOIN Erp.cir_order co
        ON co.order_num = sfo.increment_id
    WHERE co.status LIKE '3' AND
          DATE(SFO.created_at) >= '2016-02-01' AND
          DATE(SFO.created_at) <= '2016-06-31'
) AS ch
 ON 
cir_order.order_num = sq.increment_id
    WHERE cir_order.status LIKE '3' AND
          cir_order.order_num = ch.increment_id 

为什么计数(1)会改变&#34;总数&#34;外部查询返回的记录数量,内部查询中的条件发生变化?

由于我正在使用A LEFT OUTER JOIN,因此我不明白为什么从子查询中筛选出来的incrementId应该更改外部查询返回的记录数?如果我在加入条件中使用incrementId,那就是左连接,我的意思是我需要来自cir_order表的所有内容,状态为LIKE&#39; 3&#39;。

(我故意将它用作子查询)。只是不确定它为什么会像这里一样。

我可以得到一些帮助吗?

编辑:

我的问题是如何获取外部查询返回的记录总数,而不关心由于ON子句中的条件而过滤的记录。我相信我们使用外连接吗?那是我尝试过的。我的意思是,当我说LEFT OUTER JOIN时,即使在order_num没有找到与increment_id的匹配时也忽略,在帐户中取出order_num并给我总行数

EDit2:我的原始查询如下所示:

SELECT count(1) as TotalCirOrders, sq.statusDifferentCount as faultCount
FROM 
Erp.cir_order corder
left JOIN 
(
SELECT count(1) over() as statusDifferentCount, sfo.created_at as createdAt, sfo.increment_id as incrementId
FROM 
Magento.sales_flat_order sfo
LEFT JOIN 
Erp.cir_order cir_order
ON
cir_order.order_num = sfo.increment_id
where
cir_order.status ='3'
AND
sfo.status NOT IN ('refund', 'partial_refund', 'exchange', 'refund_cash', 'partial_refund_cash', 'refund_points')
AND
TO_DATE(SFO.created_at) >= '2016-02-01'
AND
TO_DATE(SFO.created_at) <= '2016-06-31'
) 
AS sq
ON
corder.order_num = sq.incrementId
where
corder.status ='3'
GROUP BY statusDifferentCount;

编辑3:我需要计算order_num和increment_id的数量。虽然条件不同。我只从sales_flat_order表中获取日期字段,所以在商业术语中,我需要计算我们&#34;创建&#34;的cir的order_num。在给定的范围内,然后我需要计算的另一件事是&#34;在给定范围内创建的增量id的数量,状态,即不在提到的列表中#34;

2 个答案:

答案 0 :(得分:1)

当子查询返回具有increment_id相同值的多个记录时,计数可能会有所不同。

LEFT JOIN还存在一个问题:如果LEFT JOIN按预期工作(与INNER JOIN不同),则不得在{{{{}}的联接表上添加任何条件1}}子句,因为在实践中会将WHERE转换为LEFT JOIN(除非你有INNER JOIN条件:这有意义)。在您的查询中,这发生在这里:

IS NULL

您可以将LEFT JOIN Erp.cir_order cir_order ON cir_order.order_num = sfo.increment_id where cir_order.status ='3' 条件移到WHERE cir_order.status ='3'子句中,并仅计算ON的不同值来解决上述问题:

cir_order.order_num

另一个计数,即受 status 的额外条件影响的那些 increment_id 的计数,你可以通过将该条件移出{{1 }}子句进入SELECT COUNT(DISTINCT cir_order.order_num) ... etc. 构造并对其执行计数:

WHERE

答案 1 :(得分:0)

解决方案是简单地用

包装整个查询

CASE ... WHEN ... THEN increment_id END