Rumah >pangkalan data >tutorial mysql >Mengapa Subquery SQL Saya Mengembalikan Ralat 'Subquery return more than 1 value'?

Mengapa Subquery SQL Saya Mengembalikan Ralat 'Subquery return more than 1 value'?

Linda Hamilton
Linda Hamiltonasal
2025-01-17 15:06:10209semak imbas

Why Does My SQL Subquery Return a

SQL Server Subquery Mengembalikan Berbilang Baris: Penyelesaian Masalah dan Penyelesaian

Pertanyaan SQL berikut menunjukkan masalah biasa: subkueri mengembalikan lebih daripada satu nilai, yang membawa kepada ralat.

<code class="language-sql">SELECT 
   orderdetails.sku,
   orderdetails.mf_item_number,
   orderdetails.qty,
   orderdetails.price,
   supplier.supplierid,
   supplier.suppliername,
   supplier.dropshipfees,
   cost = (SELECT supplier_item.price
           FROM   supplier_item,
                  orderdetails,
                  supplier
           WHERE  supplier_item.sku = orderdetails.sku
                  AND supplier_item.supplierid = supplier.supplierid)
FROM   orderdetails,
       supplier,
       group_master
WHERE  invoiceid = '339740'
       AND orderdetails.mfr_id = supplier.supplierid
       AND group_master.sku = orderdetails.sku  </code>

Melaksanakan pertanyaan ini menghasilkan ralat: "Subquery mengembalikan lebih daripada 1 nilai. Ini tidak dibenarkan apabila subquery mengikuti =, !=, <, >, >= atau apabila subquery digunakan sebagai ungkapan ."

Masalahnya: Keputusan Subkueri Berbilang Baris

Ralat timbul kerana subkueri (SELECT supplier_item.price...) boleh mengembalikan berbilang nilai price. Ini kerana klausa WHERE tidak mengenal pasti satu rekod supplier_item secara unik untuk setiap rekod orderdetails. Subkueri yang digunakan dengan cara ini memerlukan hasil tunggal yang tidak jelas.

Penyelesaian: Menggunakan JOIN untuk Mendapatkan Data yang Cekap

Pendekatan yang cekap dan betul ialah menggantikan subkueri dengan operasi JOIN eksplisit:

<code class="language-sql">SELECT
    od.Sku,
    od.mf_item_number,
    od.Qty,
    od.Price,
    s.SupplierId,
    s.SupplierName,
    s.DropShipFees,
    si.Price as cost
FROM
    OrderDetails od
    INNER JOIN Supplier s on s.SupplierId = od.Mfr_ID
    INNER JOIN Group_Master gm on gm.Sku = od.Sku
    INNER JOIN Supplier_Item si on si.SKU = od.Sku and si.SupplierId = s.SupplierID
WHERE
    od.invoiceid = '339740'</code>

Pertanyaan yang disemak ini menggunakan INNER JOIN untuk menyambungkan jadual OrderDetails, Supplier, Group_Master dan Supplier_Item berdasarkan padanan Sku dan SupplierId. Ini memastikan bahawa hanya baris yang sepadan digabungkan, menghalang subquery daripada mengembalikan berbilang nilai. si.Price dipilih terus sebagai cost, memberikan harga yang betul untuk setiap butiran pesanan. Kaedah ini jauh lebih cekap dan boleh dibaca daripada menggunakan subkueri berkorelasi dalam senario ini.

Atas ialah kandungan terperinci Mengapa Subquery SQL Saya Mengembalikan Ralat 'Subquery return more than 1 value'?. 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