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

kbe*_*son 1 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
Run Code Online (Sandbox Code Playgroud)

这是直接查询

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
Run Code Online (Sandbox Code Playgroud)

这是子查询

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
Run Code Online (Sandbox Code Playgroud)

我不确定这里发生了什么,我会假设子查询中的所有结果行都将构成临时表查询,但那些具有null invoice_ids的行不可用.

编辑:正如下面选择的答案所暗示的,这是一个分组问题.该item表中包含更多item条目,并且具有不同的item_group_ids.由于item_group_id未按子分类,因此在子查询中将具有空invoice_id字段的所有项组合在一起.然后,MAX(item_group_id)选择将返回最高item_group_id,而不是直接查询中的任何一组相同的item_group_ids.

改变GROUP BY invoice_idGROUP BY item_group_id, invoice_id产生我正在寻找的东西.

use*_*408 5

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

首先WHERE应用第一个查询,然后对结果进行分组,而在第二个查询中GROUP首先完成ing(因为它在子查询中),并且在分组结果上应用where.