为什么此子查询导致返回的行不同于直接查询?

时间:2014-01-02 18:54:47

标签: sql sql-server

以下是相关数据

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会产生我正在寻找的内容。

1 个答案:

答案 0 :(得分:5)

结果不同,因为WHERE过滤器在两个查询中的查询执行的不同阶段应用。

在第一个查询中首先应用WHERE然后将结果分组,而在第二个查询中首先完成GROUP(因为它在子查询中)并且应用了where关于分组的结果。