Sql 如何避免联合排序

Sql 如何避免联合排序,sql,sql-server,Sql,Sql Server,我的问题很简单,如何避免UNIONALL查询所做的自动排序 这是我的问题 SELECT * INTO #TEMP1 FROM Final SELECT * INTO #TEMP2 FROM #TEMP1 WHERE MomentId = @MomentId SELECT * INTO #TEMP3 FROM #TEMP1 WHERE RowNum BETWEEN @StartRow AND @EndRow SELECT * INTO #TEMP4 FROM (SEL

我的问题很简单,如何避免UNIONALL查询所做的自动排序

这是我的问题

SELECT * INTO #TEMP1 FROM Final

    SELECT * INTO #TEMP2 FROM #TEMP1 WHERE MomentId = @MomentId

    SELECT * INTO #TEMP3 FROM #TEMP1 WHERE RowNum BETWEEN @StartRow AND @EndRow

    SELECT * INTO #TEMP4 FROM (SELECT *FROM #TEMP3 UNION ALL SELECT *FROM #TEMP2) as tmp

    SELECT DISTINCT * FROM #TEMP4

我正在使用SQLServer2008。我需要所有的联合都像一个简单的连接一样执行,但事实并非如此!感谢你在这方面的帮助

我不熟悉SQL Server,但您可能会明白我的意思

select *, 'A' tid, rownumber() tno from tableA
union all
select *, 'B', rownumber() from tableB
order by tid, tno;

这将按特定顺序获取tableA的所有记录,然后按特定顺序获取tableB的所有记录。

我认为您搞错了导致排序的实际操作。检查下面的代码,UNION ALL不会导致排序。您可能正在查看DISTINCT操作,它使用排序(它对所有项进行排序,并消除重复项)


UNION ALL
添加所有记录,其中as
UNION
仅添加新的/不同的记录

由于您很快就在使用
UNION ALL
DISTINCT
,因此我认为您正在寻找
UNION

SELECT * INTO #TEMP4 FROM
    (
     SELECT * FROM #TEMP3 
     UNION  --JUST UNION 
     SELECT * FROM #TEMP2
    ) AnotherTemp
或者你可以把它简化为

SELECT * INTO #TEMP4 FROM
        SELECT DISTINCT * 
        FROM Final
        WHERE MomentId = @MomentId OR RowNum BETWEEN @StartRow AND @EndRow

如果要避免与
UNION ALL
对应的排序。你需要自己放点东西。你需要什么样的排序?为什么一个联合所有,紧接着一个不同的结果?哇!对不起,我的错。我不认为Distinct一直在整理桌子。。。谢谢你指出这一点+我已经把你的例子讲给大家看了。那么我的问题是,如何避免按DISTINCT排序?你不能,不幸的是,这就是操作的工作原理。它对它们进行排序并消除重复项。您可以只合并结果,但随后将对每个表进行排序。在某些时候,您需要对它们进行排序以获得唯一的值。@GarethD SqlFIDLE现在也显示执行计划?!太棒了。谢谢不完全是。在我的例子中,根据具体情况,联合将产生4行或5行。但我必须返回5行。我希望这样的事情发生。如果最后一个表中只有4行,则将另一行放入表中并返回,如果有5行,则按原样返回表。使用UNION并没有产生预期的结果。所以我还在找工作
SELECT * INTO #TEMP4 FROM
        SELECT DISTINCT * 
        FROM Final
        WHERE MomentId = @MomentId OR RowNum BETWEEN @StartRow AND @EndRow