2016-11-27 14 views
1

caseステートメントを使用して1つのテーブルで複数の行を更新したいとします。 これは、更新ステートメントです:caseステートメントを使用して複数の行を更新する1行のみを更新する

UPDATE UDSDiagnosisGroups 
SET UDSDiagnosisCategoryID = 
    CASE WHEN LineDisplay IN ('1-2', '3', '4', '4a', '4b') THEN (SELECT UDSDiagnosisCategoryID 
                   FROM UDSDiagnosisCategories 
                   WHERE UDSDiagnosisCategory = 'Selected Infectious and Parasitic Diseases') 
     WHEN LineDisplay IN ('5', '6') THEN (SELECT UDSDiagnosisCategoryID 
               FROM UDSDiagnosisCategories 
               WHERE UDSDiagnosisCategory = 'Selected Diseases of the Respiratory System') 
     WHEN LineDisplay IN ('7', '8', '9', '10', '11', '12', '13', '14', '14a') THEN (SELECT UDSDiagnosisCategoryID 
                         FROM UDSDiagnosisCategories 
                         WHERE UDSDiagnosisCategory = 'Selected Other Medical Conditions') 
     WHEN LineDisplay IN ('15', '16', '17') THEN (SELECT UDSDiagnosisCategoryID 
                 FROM UDSDiagnosisCategories 
                 WHERE UDSDiagnosisCategory = ' Selected Childhood Conditions (limited to ages 0 through 17)') 
     WHEN LineDisplay IN ('18', '19', '19a', '20a', '20b', '20c', '20d') THEN (SELECT UDSDiagnosisCategoryID 
                        FROM UDSDiagnosisCategories 
                        WHERE UDSDiagnosisCategory = 'Selected Mental Health and Substance Abuse Conditions') 
    END           
FROM UDSDiagnosisGroups 
WHERE UDSDiagnosisCategoryID IS NULL 

問題のみ1行がUDSDiagnosisGroupsテーブルで更新されていることです。 更新される行はの値が1-2のものです。 その他の値はすべてNULLのままです。

どこが間違っていますか?私が見つけた例に従っていますが、テーブルのすべての行ではなく、1行だけが更新されています。私はこのような何かにあなたのコードを変更することをお勧めしたい

+0

私に似ています。なぜあなたがマッチを得ていないのかを知るには、case文I.Eを選択します。 UPDATE UDSDiagnosisGroups SET UDSDiagnosisCategoryID =を削除し、SELECTで置き換えます。その後、ELSE LineDisplayを最後に置くと、一致していないときのLineDisplayの値が表示されます。 –

+0

OK。私があなたの提案をすると、データ型に関するエラーが発生します。 'LineDisplay'はvarchar(5)であり、IDはintです。しかし、私はIDを 'LineDisplay'値に基づいて設定する必要があります。したがって、 'LineDisplay'がこの値のリストであるとき、selectステートメントに基づいてIDを選択します。 –

+0

私はそれを理解しました。 'LineDisplay'文字列は、文字列の先頭に空のvarcharを持っていました。これらの文字をトリミングすると、更新が機能します。 @Robert Bainの提案に感謝します。 –

答えて

0

、それは次にあなたがUDSDiagnosisCategoriesから返される行が有効であるかどうかを確認するために代わりupdateselectをプレイして行うことができますはるかに読みやすい

UPDATE UDSDiagnosisGroups SET 
    UDSDiagnosisCategoryID = d.UDSDiagnosisCategoryID 
from UDSDiagnosisGroups as g 
    inner join UDSDiagnosisCategories as d on 
     d.UDSDiagnosisCategory = 
      case 
       when g.LineDisplay in ('1-2', '3', '4', '4a', '4b') then 
        'Selected Infectious and Parasitic Diseases' 
       when g.LineDisplay in ('5', '6') then 
        'Selected Diseases of the Respiratory System' 
       when g.LineDisplay in ('7', '8', '9', '10', '11', '12', '13', '14', '14a') then 
        'Selected Other Medical Conditions' 
       when g.LineDisplay in ('15', '16', '17') then 
        ' Selected Childhood Conditions (limited to ages 0 through 17)' 
       when g.LineDisplay in ('18', '19', '19a', '20a', '20b', '20c', '20d') then 
        'Selected Mental Health and Substance Abuse Conditions' 
where 
    g.UDSDiagnosisCategoryID is null 

だろう。そこにいくつかのタイプミスがあるかもしれません。データなしでもっと話すのは難しいです。

0

カラムの値が空である可能性があります。Nullではありません。 ISNULLを使用してもう一度お試しください。

UPDATE UDSDiagnosisGroups 
SET UDSDiagnosisCategoryID = 
    CASE WHEN LineDisplay IN ('1-2', '3', '4', '4a', '4b') THEN (SELECT UDSDiagnosisCategoryID 
                   FROM UDSDiagnosisCategories 
                   WHERE UDSDiagnosisCategory = 'Selected Infectious and Parasitic Diseases') 
     WHEN LineDisplay IN ('5', '6') THEN (SELECT UDSDiagnosisCategoryID 
               FROM UDSDiagnosisCategories 
               WHERE UDSDiagnosisCategory = 'Selected Diseases of the Respiratory System') 
     WHEN LineDisplay IN ('7', '8', '9', '10', '11', '12', '13', '14', '14a') THEN (SELECT UDSDiagnosisCategoryID 
                         FROM UDSDiagnosisCategories 
                         WHERE UDSDiagnosisCategory = 'Selected Other Medical Conditions') 
     WHEN LineDisplay IN ('15', '16', '17') THEN (SELECT UDSDiagnosisCategoryID 
                 FROM UDSDiagnosisCategories 
                 WHERE UDSDiagnosisCategory = ' Selected Childhood Conditions (limited to ages 0 through 17)') 
     WHEN LineDisplay IN ('18', '19', '19a', '20a', '20b', '20c', '20d') THEN (SELECT UDSDiagnosisCategoryID 
                        FROM UDSDiagnosisCategories 
                        WHERE UDSDiagnosisCategory = 'Selected Mental Health and Substance Abuse Conditions') 
    END           
FROM UDSDiagnosisGroups 
WHERE ISNULL(UDSDiagnosisCategoryID,'') = '' 
関連する問題