Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai dengan Cekap ke Baris Pertama Jadual Berkaitan dalam SQL?

Bagaimana untuk Menyertai dengan Cekap ke Baris Pertama Jadual Berkaitan dalam SQL?

DDD
DDDasal
2025-01-17 06:18:09637semak imbas

How to Efficiently Join to the First Row of a Related Table in 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!

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