2011-05-13 16 views
1

次のクエリがあるとします。入れ子になったクエリがNULL(0の結果)を返した場合、ストアドプロシージャは以下のエラーでクラッシュします。私は以下の代替クエリでコードを書き直すことができることを知りましたが、簡単な構文を書こうと思っています。私はこれらのうち約10を持って、いくつかは複数のネストされたクエリを持っています。それらを簡単に書く方法はありますか?私はSQLの専門家ではないので、私は常に提案を探しています!ありがとう。ネストされたクエリが結果を返さない場合は、変数をNULLに設定します。

クエリ(つまり、時々クラッシュする):クエリから

SET @sampleid = (
    SELECT 
     [sampleid] 
    FROM [sample] 
    WHERE [identifyingnumber] = @sample_identifyingnumber 

エラー:クラッシュすることはありません

Subquery returned more than 1 value. This is not permitted when the subquery 
follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

代替クエリ:

IF 
(
    SELECT 
     COUNT([sampleid]) 
    FROM [sample] 
    WHERE [identifyingnumber] = @sample_identifyingnumber 
) = 0 
BEGIN 
SET @sampleid = NULL 
END 
ELSE 
BEGIN 
SET @sampleid = 
(
    SELECT 
     DISTINCT [sampleid] 
    FROM [sample] 
    WHERE [identifyingnumber] = @sample_identifyingnumber 
) 
END 
より複雑だ

===============

例:identifyingnumberにsample_tableのレコードを存在しないのレコードをNULLに設定した

SET @testcodeid = (
    SELECT 
     [testcodeid] 
    FROM [testcode] 
    WHERE [testcode].[name] = (
     SELECT [test_code] 
     FROM [ws_test_request] 
     WHERE [client_id] = @clientid 
      AND [sample_specimen_id] = @sample_identifyingnumber 
    ) 
); 
+1

を試してみてください。.. 。 –

+0

データを消去したら、 'ON DELETE SET NULL'参照アクションを使用して外部キーを追加することで問題が解決されるようにしてください(または、理想的にはデータベースからNULL可能な列を完全に削除してください)。 – onedaywhen

答えて

2

は、あなたが言及したエラーは、複数の結果は、ゼロではないが返され、そしてあなたがあなたの代わりのクエリに「明確な」キーワードを追加することにより、固定されたときに発生するものである場合を除き

SELECT @sampleid = [sampleid] 
FROM [sample] 
WHERE [identifyingnumber] = @sample_identifyingnumber 
+0

OMG ..それはとても簡単です!ありがとうございます - あなたは天才です。あなたがバッジを与える方法を教えてもらえれば、私はあなたにそれを与えます。私は以前にそれをやったことがない。 – MacGyver

0

:あなたがMIN(DISTINCT sampleid)にidentifying_number = sample_identifyingnumber sample_tableレコードに存在するため、フィールドsampleidを設定

UPDATE my_table 
    SET sampleid = NULL 
WHERE NOT EXISTS 
      (SELECT 'X' 
      FROM sample_table 
      WHERE identifyingnumber = sample_identifyingnumber); 

を:sample_identifyingnumberに等しいです

UPDATE my_table 
    SET sampleid = 
      (SELECT MIN (DISTINCT sampleid) 
      FROM sample_table 
      WHERE identifyingnumber = sample_identifyingnumber) 
WHERE EXISTS 
      (SELECT 'X' 
      FROM sample_table 
      WHERE identifying_number = sample_identifyingnumber); 

私はMINを書かれている(DISTINCT ...)私たちは同じidentifyingnumberに対応し、よりsampleidsを見つける場合にはこの不運な場合には、私は別のsampleids(X厳密> 1で)Xの最小値を取ります。

1つではなく2つの更新が必要です。

+1

' 'MIN'を取って、あなたは' DISTINCT'を必要としません –

+0

あなたはそうです、MINは最低値をとります。 – UltraCommit

関連する問題