2017-04-11 16 views
0

項目がブリッジテーブルにどのように移入されるかのテンプレートとして存在するテーブルから既存のブリッジテーブルを作成しようとしています。複数の結果を含むSQL Serverサブクエリ

dbo.ECN_ChecklistItem(ECNID(外部キーID)によって選択)の項目のリストがdbo.BusinessUnit_ChecklistItemと異なるブリッジテーブル(dbo.ECN_ChecklistItem)に新しい挿入を試みています(BusinessUnitとInUse)。

サブクエリが使用されているとき、またはサブクエリが使用されているときにサブクエリが=、!=、<、< =、>、または=表現として。

私は '='演算子ではなく 'in'演算子を含むようにクエリを変更しようとしましたが、これも成功しませんでした。私はそれを間違ってやったかもしれない。

CREATE PROCEDURE checkCurrentChecklistItemsAgainstInUseItems 
     --Parameters 
     @ECNID INT, --I need the ECNID to do the search properly. 
     @BU NVARCHAR(50), 
     @Date NVARCHAR(10), --This is the date that the checklist item was added to the ECN. 
     @NewStatus NVarchar(3) --This is based off of the status of the ECN, will either be '?' or 'No' 

    AS 
    BEGIN 

     DECLARE @System NCHAR(6)='SYSTEM' 
     DECLARE @Message NVARCHAR(50) = 'This value was added by the system automatically.'--Not in use. 

     SET NOCOUNT ON; 

    INSERT INTO dbo.ECN_ChecklistItem (ECNID, Required, LogBy, LogDate, Description, CheckName) 
VALUES(@ECNID, @NewStatus, @System, @Date, NULL, 
    (Select ChecklistItem FROM dbo.BusinessUnit_ChecklistItem WHERE BusinessUnit Like @BU 
    EXCEPT SELECT CheckName FROM dbo.ECN_ChecklistItem WHERE ECNID Like @ECNID)) 

    END 
    GO 
+1

'INSERT ... VALUES'構文は、テーブルに1つのレコードのみを挿入します。これは、あなたの望むことですか?その場合は、サブクエリ内に1つの 'CheckListItem'だけを選択してください。 「TOP 1」である。それ以外の場合は、別の構文を使用することもできます。 –

+0

select文が1つ以上のChecklistItemを返すときに、何をしたいですか? –

+0

ChecklistItemをdbo.ECN_ChecklistItemテーブルに挿入します。 SELECT EXCEPTクエリは複数の値を返す可能性があります。この状況を処理するための別の構造を考慮する必要がありますか? –

答えて

0

残りのInsert文は1行に向かっています。ただし、副問合せは複数の行を戻す可能性があります(または戻す可能性があります)。このような状況が発生するたびに、SQL Serverはこれを実行します。

サブクエリを別々にクエリとして実行して、返される行のみが存在すると仮定しても複数の行が返されるかどうかを調べることができます。

実際に複数の行がある場合は、論理に応じてその状況を個別に処理する必要があります。 しかし、1つの行だけが返されていることが確かな場合は、常にMAXまたはMINまたはTOP 1にすることができます。単一の行が返されているときは重要ではありませんが、 '副問い合わせ返りmutliple'エラーは発生しません。

編集: 実際に複数の行を挿入する場合は、Values句を完全な選択句で置き換えます。他のすべてのフィールドの値は固定値(@ 1)で残り、CheckNameの値はselectステートメントから。 @ ...、@ ...、@ ....、...を選択します。CheckListItem From .... BusinessUnitのようなもの...例外...など。

+0

SELECT EXCEPTステートメントは複数の値を返す可能性が非常に高いです。大部分のユースケースは返されますが、古いレコードの場合は複数の値が返される可能性があります。この場合、返された値のすべてを使用する必要があります。これを達成するより良い方法はありますか? –

+0

すべての行を挿入しますか?はいの場合は、Values句を完全な選択句で置き換えます。他のすべてのフィールドの値は固定値(@ 1)のままで、CheckNameの値はselect文から得られます。 @ ...、@ ...、@ ....、...を選択してください。CheckListItem From .... BusinessUnitのような場所...例外...など。 これがあなたにとって必要なものであれば、このコメントを含めるために私の答えを編集することができます。 –

+0

これは意図した通りに機能しました。あなたが答えを修正してその解決策を含めるなら、私はそれを受け入れます。 –

関連する問題