0

以下は私が持っているクエリです。

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

サブクエリは並べ替えられていない結果セットを返しますが、2 番目のクエリを実行した後、結果は並べ替えられます。サブクエリと同じ順序で結果を取得するにはどうすればよいですか。

4

2 に答える 2

2

クエリで使用するデータセットは、物理テーブルであるか派生テーブルであるかに関係なく、デフォルトでunorderedです。実際にクエリを実行しているときにサーバーが行を読み取るために使用する順序は、制御できません。つまり、「そのサブクエリと同じ」順序を確実に指定することはできません。代わりに、特定の順序を念頭に置いて、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 select result も同じことを行います。そのため、tblTestOverview テーブルのプライマリ インデックス キー フィールドを tblQuestionTable の選択クエリに含め、そのフィールドに基づいて order by 句を指定する必要があります。

于 2013-10-08T09:22:00.447 に答える