Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menyertai Dengan Cekap Hanya Baris Pertama Jadual Berkaitan dalam SQL?
Memilih Baris Pertama Sahaja daripada Jadual Berkaitan dalam SQL Joins
Penyertaan pangkalan data selalunya mendapatkan berbilang baris yang sepadan daripada jadual yang berkaitan. Artikel ini menangani senario di mana anda perlu mengehadkan penyertaan kepada satu baris bagi setiap rekod induk, walaupun terdapat beberapa padanan. Ini menghalang hasil pendua dalam output pertanyaan anda.
Cabarannya
Pertimbangkan dua jadual: Orders
dan LineItems
. Biasanya, pesanan mempunyai satu item baris, tetapi sesetengah pesanan mungkin mempunyai berbilang. Apabila memaparkan butiran pesanan, hanya menunjukkan satu item baris bagi setiap pesanan adalah penting, jika tidak, pendua mengeruhkan keputusan.
Pendekatan Awal (dan kegagalannya)
Percubaan naif untuk menggunakan TOP 1
dalam gabungan secara langsung gagal kerana pertanyaan dalam tidak dapat mengakses lajur jadual luar (seperti OrderID
).
Penyelesaian: CROSS APPLY dan INNER JOIN
Pendekatan paling berkesan menggunakan CROSS APPLY
(tersedia dalam SQL Server 2005 dan lebih baru) atau INNER JOIN
pintar untuk versi yang lebih lama.
Menggunakan CROSS APPLY (SQL Server 2005 dan lebih baru)
CROSS APPLY
menjana set baris untuk setiap baris dalam jadual luar, membolehkan subkueri berkorelasi. Subkueri ini kemudian menapis dan memilih satu baris daripada jadual yang berkaitan.
<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>
Menggunakan INNER JOIN (SQL Server pra-2005)
Untuk versi SQL Server lama yang tidak mempunyai CROSS APPLY
, INNER JOIN
dengan subkueri mencapai hasil yang sama:
<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description FROM Orders INNER JOIN LineItems ON LineItems.LineItemGUID = ( SELECT TOP 1 LineItemGUID FROM LineItems WHERE OrderID = Orders.OrderID )</code>
Nota Penting tentang Determinisme:
Klausa TOP 1
sememangnya bukan penentu tanpa klausa ORDER BY
. Untuk menjamin hasil yang konsisten (iaitu, sentiasa memilih item baris "pertama" sama), tambah klausa ORDER BY
dalam pertanyaan dalam (mis., ORDER BY LineItems.SomeColumn
). Ini memastikan pemilihan item baris yang boleh diramal.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyertai Dengan Cekap Hanya Baris Pertama Jadual Berkaitan dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!