3

これが重複しているように見えることはわかっていますが、同様の質問に取り組んでいますが、それでもこのエラーを回避できません。

この SQL UPDATE クエリが「サブクエリが複数の値を返しました」というエラーを返す理由がわかりません。

UPDATE ph
SET ph.manufacturerPartNumber = t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

関係するデータは以下です。

SELECT t.partID,t.DocID,ph.partID,ph.manufacturerPartNumber
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

ここに画像の説明を入力

「複数の値」がどこから来ているのかわかりません。t からの各 partID には、ph に正確に 1 つの partID があります。

同じエラーで次のことも試しました。

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

シンプルなものが欠けていると確信していますが、それが欠けていると確信しています。

助けてくれてありがとう、ダン

4

4 に答える 4

6

あなたが作成した SQL が問題ないことは確かなので、一度に更新される複数の行を処理するために作成されていないテーブルに ON UPDATE/AFTER UPDATE トリガーがある可能性があることをお勧めします。

これは、更新関連のトリガーを無効にして、更新を再度実行することで、すぐに検証できます。

編集:

これをテストしている間にトリガーを無効にした場合は、後で再度有効にしてください。更新が1つの行にのみ影響することを保証できないため、トリガーを修正する必要があります-トリガーの対象となるプロセス(おそらく監査?)を続行したい場合。

于 2013-02-15T14:51:48.053 に答える
0

以下で使用しているクエリは、複数の行を返します。

SELECT t.partID,t.DocID,ph.partID,ph.manufacturerPartNumber
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

だから、これをやろうとすると

UPDATE ph
SET ph.manufacturerPartNumber = t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

#tmp から複数の行が返されるため、単一の t.DocID はありません。したがって、更新の RHS が=1 つの値のみを返すようにしてください。

于 2013-02-15T14:32:10.300 に答える
0

結果がうまくいかない理由がわかりません。Temp テーブルが PartId ごとに複数の DocId を返す場合、2 番目のクエリで上記のエラーが発生する可能性があります。ただし、最初のクエリは機能するはずです。

このフィドルを参照してください: http://sqlfiddle.com/#!3/9d34b/1

SQL Server は重複したレコードをスキップし、それに応じて更新します。

于 2013-02-15T14:23:00.230 に答える
0

サブクエリに重複する行が含まれていないと確信している場合は、これを変更してみてください。

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

これに:

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT max(t.DocID)
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

ただし、これが私の問題である場合、単にソフトウェアよりも賢いと仮定するのではなく、一時テーブルにもう少しクエリを実行することになります。

于 2013-02-15T14:46:57.103 に答える