Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai dengan Cekap ke Baris Pertama Jadual Berkaitan dalam SQL?
Memilih Hanya Baris Pertama daripada Jadual Berkaitan dalam SQL
Banyak set data mengandungi baris dengan berbilang entri daripada jadual berkaitan. Menyertai jadual ini dengan cekap memerlukan strategi untuk mengelakkan pertindihan data. Artikel ini menunjukkan cara untuk menyertai hanya baris pertama jadual yang berkaitan untuk setiap entri dalam jadual utama.
Cabaran: Mengelakkan Penyertaan Pendua
Sambungan mudah mungkin menghasilkan berbilang baris untuk setiap pesanan jika jadual berkaitan mempunyai berbilang entri untuk satu ID pesanan. Kami memerlukan kaedah untuk memilih hanya baris pertama yang berkaitan.
Pendekatan Tidak Berkesan: TOP 1
Perangkap
Percubaan naif menggunakan TOP 1
dalam pilihan dalam gagal kerana pertanyaan dalam tidak dapat mengakses lajur jadual luar (seperti OrderID
).
Penyelesaian Berkesan: Dua Kaedah Terbukti
Dua kaedah yang boleh dipercayai mencapai hasil yang diinginkan:
1. CROSS APPLY
(SQL Server 2005 dan kemudian):
Pendekatan ini menggunakan CROSS APPLY
untuk mengaitkan pertanyaan luar dan dalam dengan cekap:
<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>
2. INNER JOIN
(Untuk versi SQL Server sebelum 2005):
Untuk versi SQL Server yang lebih lama, INNER JOIN
dengan subkueri mencapai hasil yang sama:
<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>
Kedua-dua kaedah menggunakan TOP 1
untuk memilih baris padanan pertama sahaja daripada LineItems
. Ini menghapuskan lebihan data.
Memastikan Keputusan Deterministik
Yang penting, tanpa klausa ORDER BY
dalam pernyataan SELECT
dalaman, baris "pertama" adalah sewenang-wenangnya. Pelaksanaan pertanyaan yang berbeza mungkin mengembalikan hasil yang berbeza, walaupun dengan data yang sama. Sentiasa masukkan klausa ORDER BY
dalam pertanyaan dalaman untuk menjamin hasil yang konsisten dan boleh diramal. Contohnya:
<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description FROM LineItems WHERE LineItems.OrderID = Orders.OrderID ORDER BY LineItems.SomeColumn -- Add a column to order by</code>
Contoh SQLfiddle yang menunjukkan teknik ini tersedia (pautan ditinggalkan, kerana tidak mungkin untuk membuat pautan SQLfiddle langsung di sini). Rujuk sumber dalam talian untuk contoh praktikal.
Atas ialah kandungan terperinci Bagaimana untuk Menyertai dengan Cekap ke Baris Pertama Jadual Berkaitan dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!