Mengelakkan Nombor Pesanan Pendua dalam Gabungan Item Berbilang Baris
Pangkalan data bergabung yang melibatkan jadual dengan berbilang item baris bagi setiap pesanan selalunya membawa kepada nombor pesanan pendua dalam keputusan. Artikel ini meneroka penyelesaian yang cekap untuk mendapatkan hanya satu rekod bagi setiap pesanan unik.
Pendekatan Awal dan Kekurangannya
Pendekatan mudah mungkin melibatkan memilih item baris "TOP 1" sahaja. Walau bagaimanapun, ini gagal disebabkan oleh pengehadan dalam mengakses terus jadual luar dari dalam pernyataan pilih dalam.
Penyelesaian Cekap: SALANG GUNA
Pengendali CROSS APPLY
menyediakan penyelesaian yang elegan:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description FROM Orders CROSS APPLY ( SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ) LineItems2</code>
CROSS APPLY
cekap mendapatkan semula item baris pertama untuk setiap pesanan, menghalang nombor pesanan pendua.
Alternatif untuk Versi Pelayan SQL Lama: INNER JOIN
Untuk versi SQL Server sebelum 2005, INNER JOIN
menawarkan penyelesaian yang setanding:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
Memastikan Keputusan Deterministik
Yang penting, TOP 1
tanpa klausa ORDER BY
adalah bukan penentu. Item baris yang dipilih mungkin berbeza antara pelaksanaan pertanyaan, walaupun dengan data yang tidak berubah. Sentiasa masukkan klausa ORDER BY
dalam pertanyaan dalaman untuk menjamin hasil yang konsisten.
Atas ialah kandungan terperinci Bagaimana untuk Menghapuskan Nombor Pesanan Pendua Apabila Menyertai Jadual dengan Item Baris Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!