Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menggunakan ROW_NUMBER() Tanpa ORDER BY dalam SQL Server 2005?

Bagaimanakah Saya Boleh Menggunakan ROW_NUMBER() Tanpa ORDER BY dalam SQL Server 2005?

Susan Sarandon
Susan Sarandonasal
2024-12-24 14:52:15663semak imbas

How Can I Use ROW_NUMBER() Without ORDER BY in SQL Server 2005?

ROW_NUMBER() tanpa ORDER BY dalam SQL Server 2005

Dalam SQL Server 2005, fungsi ROW_NUMBER() boleh digunakan untuk menjana nombor jujukan unik untuk setiap baris dalam set hasil. Walau bagaimanapun, tidak seperti rakan sejawatannya dalam versi kemudian, ROW_NUMBER() dalam SQL Server 2005 memerlukan klausa ORDER BY yang jelas. Had ini menimbulkan cabaran apabila cuba menjana nombor berjujukan tanpa mengubah susunan asal data.

Penyelesaian:

Untuk mengatasi had ini, kita boleh mengelak daripada menyatakan pesanan eksplisit menggunakan pertanyaan berikut sintaks:

INSERT INTO TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM SourceTable
WHERE {somecondition};

Penjelasan:

  • ORDER paling luar OLEH (PILIH 1) berfungsi sebagai pemegang tempat, dengan berkesan mengelakkan sebarang pesanan eksplisit.
  • Petua WITH (TABLOCKX, HOLDLOCK) digunakan untuk mengelakkan isu konkurensi dengan memastikan kunci meja eksklusif.

Pertimbangan:

  • Penyelesaian ini tidak menjamin bahawa susunan asal data akan dikekalkan. Faktor lain, seperti kunci dan proses serentak, boleh menjejaskan tertib yang terhasil.
  • Ia tidak secekap menggunakan lajur identiti untuk penambahan automatik.
  • Menggunakan lajur identiti adalah pilihan utama penyelesaian atas sebab keselarasan dan prestasi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan ROW_NUMBER() Tanpa ORDER BY dalam SQL Server 2005?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn