ホームページ >データベース >mysql チュートリアル >SQL サブクエリが「サブクエリが複数の値を返しました」エラーを返すのはなぜですか?

SQL サブクエリが「サブクエリが複数の値を返しました」エラーを返すのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-17 15:06:10162ブラウズ

Why Does My SQL Subquery Return a

複数の行を返す 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 を使用して、OrderDetailsSupplier の一致に基づいて Group_MasterSupplier_ItemSku、および SupplierId テーブルを接続します。これにより、一致する行のみが結合され、サブクエリが複数の値を返すことがなくなります。 si.Pricecost として直接選択され、各注文詳細の正しい価格が提供されます。 この方法は、このシナリオで相関サブクエリを使用するよりもはるかに効率的で読みやすいです。

以上がSQL サブクエリが「サブクエリが複数の値を返しました」エラーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。