以下是我的查询。
select * from tblQuestionTable where Paper='HTML' and QuestionId in (select QuestionId from tblTestOverview where TestId=1)
子查询给出了一个未排序的结果集,但是在查询第二个选择之后,结果是排序的。如何以与子查询相同的顺序获得结果。
以下是我的查询。
select * from tblQuestionTable where Paper='HTML' and QuestionId in (select QuestionId from tblTestOverview where TestId=1)
子查询给出了一个未排序的结果集,但是在查询第二个选择之后,结果是排序的。如何以与子查询相同的顺序获得结果。
默认情况下,您的查询使用的任何数据集都是无序的,无论是物理表还是派生表。无论服务器在实际执行查询时使用何种顺序从中读取行,都是您无法控制的。这意味着您无法可靠地将顺序指定为“与该子查询中的相同”。相反,为什么不只考虑一个特定的顺序并在主查询中使用 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
;
除非指定,否则默认情况下 tblQuestionTable 的选择结果将根据其主索引进行排序。tblTestOverview 选择结果也一样。因此,您需要在 tblQuestionTable 的选择查询中包含来自 tblTestOverview 表的主索引键字段,并基于该字段指定 order by 子句。