0

以下是我的查询。

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

子查询给出了一个未排序的结果集,但是在查询第二个选择之后,结果是排序的。如何以与子查询相同的顺序获得结果。

4

2 回答 2

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
;
于 2013-10-08T09:39:00.337 回答
-1

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

于 2013-10-08T09:22:00.447 回答