Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Menyertai Dengan Cekap Hanya Baris Pertama Jadual Berkaitan dalam SQL?

Bagaimanakah Saya Boleh Menyertai Dengan Cekap Hanya Baris Pertama Jadual Berkaitan dalam SQL?

Barbara Streisand
Lepaskan: 2025-01-17 06:03:35
asal
858 orang telah melayarinya

How Can I Efficiently Join to Only the First Row of a Related Table in 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan