如何从使用“in”的选择查询中获取未排序的结果?

时间:2013-10-08 09:13:36

标签: sql-server-2008

下面是我的查询。

select * from tblQuestionTable where Paper='HTML' and QuestionId in (select QuestionId from tblTestOverview where TestId=1)

子查询提供未排序的结果集,但在查询第二个选择后,结果将被排序。如何以与子查询相同的顺序获得结果。

2 个答案:

答案 0 :(得分:2)

您的查询正在使用的任何数据集默认为无序,无论是物理表还是派生表。在实际执行查询时,服务器用于从中读取行的顺序是不受控制。这意味着您无法可靠地将订单指定为“与该子查询中的相同”。相反,为什么不考虑特定订单并在主查询中使用ORDER BY明确指定它?例如,像这样:

SELECT *
FROM tblQuestionTable
WHERE Paper='HTML'
  AND QuestionId IN (SELECT QuestionId FROM tblTestOverview WHERE TestId=1)
ORDER BY QuestionId
;

话虽如此,可能接近你想要的东西。 ROW_NUMBER函数以未确定的顺序(ORDER BY (SELECT 1))为派生数据集分配行号。它可能是也可能不是服务器读取行的顺序,但您可以使用指定的值来排序最终结果集:

SELECT q.*
FROM tblQuestionTable AS q
INNER JOIN (
  SELECT
    QuestionId,
    rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
  FROM tblTestOverview
  WHERE TestId = 1
) AS o
ON o.QuestionId = q.QuestionId
ORDER BY o.rn ASC
;

答案 1 :(得分:-1)

选择tblQuestionTable的结果默认情况下将根据其主索引进行排序,除非指定。 tblTestOverview选择结果也是一样的。因此,您需要在tblQuestionTable的select查询中包含来自tblTestOverview表的主索引键feild,并根据该字段指定order by子句。