WITH 没有像我预期的那样工作 sqlServer 2012

WITH is not working as I expected sqlServer 2012

我正在将不同的结果放入 WITH 语句中。这是我的第一个查询:

with q as (select top (100000) * from table1) select * from q

假设 table1 有一个 ID 字段,如果我执行该查询,一切似乎都是正常的,它按我预期的那样工作。但是如果我像这样更改语句:

with q as (select top (100000) * from table1) select [ID] from q

with q as (select top (100000) * from table1) select q.[ID] from q

它给我带来了第一个查询中不存在的结果(请注意,我只带来了 ID)。我知道 WITH 语句是一个时间结果集,我希望无论我 select 有多少字段,这两个查询都会带来相同的结果,所以为什么会这样?如果我想执行一个更新甚至最糟糕的是,如果我进行删除,我将无法完全确定我是否影响了我想要的行

如果你select top x没有order by,结果集是任意返回的。这意味着如果执行两次,您可以获得不同的结果集。由于您稍微更改了查询,因此结果集不同我并不感到惊讶。添加一个 ORDER BY 如果你 SELECT TOP x