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!