ホームページ >データベース >mysql チュートリアル >SQL サブクエリが「サブクエリが複数の値を返しました」エラーを返すのはなぜですか?
複数の行を返す SQL Server サブクエリ: トラブルシューティングと解決策
次の SQL クエリは、一般的な問題の例です。サブクエリが複数の値を返し、エラーが発生します。
<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>
このクエリを実行すると、次のエラーが発生します。「サブクエリは複数の値を返しました。サブクエリが =、!=、<、>、>= に続く場合、またはサブクエリが式として使用される場合、これは許可されません」 ."
問題: 複数行のサブクエリの結果
サブクエリ (SELECT supplier_item.price...)
が複数の price
値を返す可能性があるため、エラーが発生します。 これは、WHERE
句が各 supplier_item
レコードに対して単一の orderdetails
レコードを一意に識別しないためです。 この方法で使用されるサブクエリには、単一の明確な結果が必要です。
解決策: JOIN を使用した効率的なデータ取得
効率的で正しいアプローチは、サブクエリを明示的な JOIN
操作に置き換えることです。
<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>
この改訂されたクエリは、INNER JOIN
を使用して、OrderDetails
と Supplier
の一致に基づいて Group_Master
、Supplier_Item
、Sku
、および SupplierId
テーブルを接続します。これにより、一致する行のみが結合され、サブクエリが複数の値を返すことがなくなります。 si.Price
は cost
として直接選択され、各注文詳細の正しい価格が提供されます。 この方法は、このシナリオで相関サブクエリを使用するよりもはるかに効率的で読みやすいです。
以上がSQL サブクエリが「サブクエリが複数の値を返しました」エラーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。