2012-01-03 12 views
6

SQL Serverテーブルの下位10個の結果を取得します。私はそれらを挿入された最後の10のレコードにしたい、どのように私はこれを行うことができますか?SQL Serverの "top"と反対の順序で、キー/インデックスはありません

私はselect bottom 10 * from mytableと書いていますが、これは存在しません(afaik)。

最後の10行を挿入します。 タイムスタンプがありません。

+0

「トップ」とは思っていません。また、テーブルのプライマリキー/ユニークIDは何ですか?SQLServerのIDまたはGUIDですか? –

+0

@ MarkBannister pkがありません – NimChimpsky

+2

最後の挿入順序を決定するために* something *を追加するためにテーブルのスキーマを変更する必要があるようです - マージレプリケーションをサポートする必要がない場合、IDENTITY関係は十分です。そうしないと、挿入されたタイムスタンプが必要になります(監査にも便利です)。 –

答えて

15

できません。

select * from mytableによって返された最後の10個のレコードが挿入された最後の10個であるという保証は全くありません。使用されるデフォルトの順序はありません。

ORDER BYが挿入順序を反映した適切な列に必要です。自動インクリメントID(主キー)は、そのテーブルのためにそこにあるならば、あなたはそれを行うことができます

+0

デフォルトの注文とそのようなものはありません。これは設計によるものです。 ORDER BY句が設定されていないときに確定的な順序を適用すると、正当な理由がないために余分なオーバーヘッドが追加されます。 [さて、私が返信していたコメントは削除されました...] –

+0

私はmytableからトップ10 *を選択すると、実際には挿入順にそれらを返します...? – NimChimpsky

+2

@NimChimpskyジョインや条件文がなく、誰も最近SQLクエリエンジンを書き直すことを選択していない(つまり、この動作は偶然であり保証されていない)場合にのみ、結果は "挿入順"になります –

5

:MySQLで

select top 10 * 
from mytable 
order by id desc 
+3

テーブルに自動インクリメントID(プライマリキー)があっても、クエリーが最後に挿入されたことを確認することはできません。例えば、値-1を指定した挿入が完了した可能性があります。 – automatic

0

あなたはトリガーを使用してそれを行うことができますselect * from table LIMIT 0,10

+2

にidentity_insertを設定したIDフィールドこの質問は、MySQLではなくSQL Server用です。 – MatBailie

0

を使用することができます。

ちょうど挿入された行のPKを、何らかの種類のインデックスを増やしながら監査テーブルに保存します(IDはおそらく十分です)。 10行以上ある場合は最も古いものを削除します。

次に、監査テーブルを元のテーブルに結合して、完全な10行を取得します。 セレクト(
が n個のDESCによってトップ4 * TBLから 順序を選択)として有底