2017-11-06 2 views
0

それは非常に簡単な質問です。向いている挿入の2つの多くの行のエラー

INSERT INTO crm.dbo.UPDATE_DATA(NAME,OLD_ID) 
VALUES (
( SELECT s.NAME FROM crm.dbo.SURROGATE as s 
    INNER JOIN crm.dbo.UPDATE_DATA ON (s.ID != crm.dbo.UPDATE_DATA.OLD_ID) 
    WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL 
), 
( SELECT SURROGATE.ID FROM crm.dbo.SURROGATE 
    LEFT JOIN crm.dbo.UPDATE_DATA ON (crm.dbo.SURROGATE.ID = crm.dbo.UPDATE_DATA.OLD_ID) 
    WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL 
) 
) 

iは誤差以下、上記のクエリは

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

私はエラーを理解することができますが、サブクエリは複数の行を返します。一方、それは1行ずつ挿入します。

解決策は何ですか?内部結合を適用することによって、左結合の代わりに、エラーは発生しません。だから問題はその解決策が内部結合である理由です。どうして他にはないの?私はそれに内部結合を適用したくないです。大量のコンテンツにごめんなさい。しかし、事前に感謝します

+1

サブクエリーの代わりに左の結合を実行します。または、サブクエリが1行だけを返すようにします。 – jarlh

+1

まず、selectの結果を挿入する場合は、 'VALUES'を使用しないでください。代わりに、reuiredとして名前とIDを返す1つのクエリを定義し、 'INSERT INTO crm.dbo.UPDATE_DATA SELECT ... 'で挿入します。第二に、テーブル構造を見ておくと便利です。 – Tyron78

+0

ありがとうございましたjarlhその作業最初にあなたは私にその解決策を提案しますので、それに答えてください。私は受け入れられた答えとしてそれをマークします。あなたがしたくない場合は、私はジャヤシリアの答えを受け入れてマークします – Ahmad

答えて

1

挿入ステートメントを使用しているときに値を使用しないでください。代わりにJoinステートメントにしてください。値を使用するときは、一度に1つのセットしか提供できないためです。たぶん、あなたはシンプルに訴える可能性がコードこの

INSERT INTO crm.dbo.UPDATE_DATA(NAME,OLD_ID) 
SELECT SURROGATE.name,SURROGATE.ID FROM crm.dbo.SURROGATE 
    LEFT JOIN crm.dbo.UPDATE_DATA ON (crm.dbo.SURROGATE.ID = crm.dbo.UPDATE_DATA.OLD_ID) 
    WHERE crm.dbo.UPDATE_DATA.OLD_ID IS NULL 
1

エラーはあなたが単一のINSERTコマンド

ためのコラムの内容として、単一の結果値のために結果以上のものをobatinことを意味してみたが、あなたに見て両方の列の結果を1つ選択してselectを挿入します。例:

Insert Into crm.dbo.UPDATE_DATA(NAME,OLD_ID) 
select s.NAME, s.ID 
from crm.dbo.SURROGATE as s 
inner join crm.dbo.UPDATE_DATA on s.ID!=crm.dbo.UPDATE_DATA.OLD_ID 
where crm.dbo.UPDATE_DATA.OLD_ID is null 
関連する問題