以下是相关数据
SELECT item_group_id
,item_id
,invoice_id
FROM item
WHERE item_group_id = 92480
# Results
92480 215342 88902
92480 215343 88902
92480 215344 88902
92480 215345 88902
92480 215346 90690
92480 215347 90690
92480 215348 NULL
92480 215349 NULL
这是直接查询
SELECT MAX(item_group_id) [item_group_id]
,MAX(invoice_id) [invoice_id]
FROM item
WHERE item_group_id = 92480
GROUP BY invoice_id
# Results
92480 NULL
92480 88902
92480 90690
这是子查询
SELECT i.item_group_id
,i.invoice_id
FROM (
SELECT MAX(item_group_id) [item_group_id]
,MAX(invoice_id) [invoice_id]
FROM item
GROUP BY invoice_id
) i
WHERE i.item_group_id = 92480
# Results
92480 90690
92480 88902
我不确定这里发生了什么,我会假设子查询中的所有结果行都将构成临时表查询,但那些带有null invoice_ids的行不可用。
编辑:
正如下面选择的答案所暗示的那样,这是一个分组问题。 item
表中包含更多item
个条目,并且item_group_id
个不同。由于item_group_id
未按类别分组,因此在子查询中,所有具有空invoice_id
字段的项都会组合在一起。然后,MAX(item_group_id)
选择会返回最高item_group_id
,而不是直接查询中的任何一组相同的item_group_ids。
将GROUP BY invoice_id
更改为GROUP BY item_group_id, invoice_id
会产生我正在寻找的内容。
答案 0 :(得分:5)
结果不同,因为WHERE
过滤器在两个查询中的查询执行的不同阶段应用。
在第一个查询中首先应用WHERE
然后将结果分组,而在第二个查询中首先完成GROUP
(因为它在子查询中)并且应用了where关于分组的结果。