1

varchar データ型として格納された注文間の値を取得するために、ストアド プロシージャにサブクエリを作成していました。クエリを実行すると、次のように表示されます。

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

サブクエリで複数の値を返すため、少しグーグルで問題を発見しました。

しかし、私の場合、指定された入力の間にあるすべての値が必要です。誰でも私がこれを達成できる方法を教えてもらえますか..

コード:

SELECT ROW_NUMBER()OVER(
                        ORDER BY po.id) AS SNo ,
       pd.Copies AS Quantity,
       pd.EstUnitPrice AS UniPrice,
       pd.Copies*pd.EstUnitPrice AS Total,

  (SELECT value
   FROM BibContents
   WHERE bibid=pd.BibId
     AND sfld='a'
     AND tagno='245') AS Title,

  (SELECT value
   FROM BibContents
   WHERE bibid=pd.BibId
     AND sfld='a'
     AND tagno='020') AS 'ISSN/ISBN',

  (SELECT value
   FROM BibContents
   WHERE bibid=pd.BibId
     AND sfld='a'
     AND tagno='100')AS Author
FROM  [VibrantMas].[dbo].[PoDetails] AS pd
      INNER JOIN Porders AS po ON po.Id=pd.PoId
WHERE po.No BETWEEN '000021' AND '000024'
4

1 に答える 1

2

BETWEENエラーをスローしているのは ではなく、のサブセレクトの 1 つですBibContents

2 つのオプションがあります

  • 簡単なルートを取り、それぞれSELECT valueを変更しますSELECT TOP 1 value
  • これらの副選択の 1 つが複数のレコードを返す理由 の根本原因を突き止めます。
    • 複数のレコードを返すべきでない場合は、一意の制約を追加して、そもそもこれが 発生しないようにする必要がありますBibContents
    • 特定の に対して複数のレコードが発生する可能性がある場合PoDetailsは、どのレコードを返すかを決定する必要があります。
    • それらすべてを返す場合は、副選択を適切な結合に変更する必要があります。

私のアドバイスは、メンテナンスの悪夢から身を守り、根本的な原因を解決することです.

別のスキームを考え出すBibContentsことも問題ありません。EAV モデルのテーマを採用しているようですが、これは悪い考えだと思います。

于 2013-02-20T06:55:18.687 に答える