2017-09-02 18 views
-2

入れ子のSelect Caseの構文を修正してください。ネストされたSelect Caseの構文エラー

Update [Tab-2 sourcing] 
set POQty = a.Quantity 
from 
(
    select 
    case when D.POQty > [Tab-2 sourcing].OpenQuantity 
    then D.POQty 
    case when D.POQty < [Tab-2 sourcing].OpenQuantity 
    then 
    (
     case when D.POQty > [Tab-2 sourcing].AlreadyAlloted 
     then D.POQty 
    ) 
    as Quantity 
    from DemandPortal D 
    inner join [Tab-2 sourcing] 
    on 
    D.PONumber = [Tab-2 sourcing].PONumber 
)a 

私はSQL Serverを初めて使用しているため、適切な選択肢を書く方法がわかりません。

+0

希望するロジックを説明してください。明らかに正しく機能していないものから正しいロジックを推論することは容易ではありません! –

+1

'ケースの場合... then ... when ... then ... else ... end'。 'else'部分はオプションです。 – jarlh

+0

"End"キーワードがありません – Anagha

答えて

1

CASEステートメントは、C#のような言語でswitchステートメントのようです。基本的にはif/elseの束を一列に並べるための複合構造です。コメントの1つで述べたように、通常はcase when <first condition> then <result on first condition> when <nth condition> then <result of nth condition> <optional else clause> endの形式をとります。オプションのelse句に注意してください。省略された場合、条件の1つを満たさなかった値はnullに設定されます。

あなたの例から、私はあなたがここで何を得ようとしているのかよく分かりません。あなたが配置した両方のパスはD.POQtyにマッピングされ、case文は実際にはの値にマップされている場合にのみ役に立ちます。あなたが望むのは、ヌルの振る舞いだからな。しかし、おそらくケース・ステートメント、または少なくともこの複雑さの1つではありません。

しかし、文を実行するためにコードをどのようにリファクタリングするのかを示すために、私が思いついたのはここにあります。 case文から直接列を更新できるので、サブクエリを削除しました。私はあなたが持っていたコンパウンドケースのステートメントを組み合わせました。なぜなら、それは単純にANDと一緒に2つの条件を入力しないと追加したものを見ていないからです。もし私があなたが求めていたところに着いていなければ、私に知らせてください。

update t2s -- References which aliased table you intend to update 
set POQty = case when D.POQty > [Tab-2 sourcing].OpenQuantity 
       then D.POQty 
       when D.POQty < [Tab-2 sourcing].OpenQuantity and D.POQty > [Tab-2 sourcing].AlreadyAlloted 
       then D.POQty 
       else null -- This is implied if you leave it off. Just adding it in so that its behavior is clear 
      end 
from DemandPortal D 
inner join [Tab-2 sourcing] t2s 
    on D.PONumber = t2s.PONumber 

CASE文のドキュメント:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

1

私はcase文が必要ではないと思われます。 where句内のすべてのチェックを行うことができます。

UPDATE T 
    SET POQty = D.POQty 
FROM 
    [Tab-2 sourcing] T 
    INNER JOIN DemandPortal D 
     ON T.PONumber = D.PONumber 
WHERE 
    D.POQty > T.OpenQuantity OR 
    (D.POQty < T.OpenQuantity AND D.POQty > T.AlreadyAlloted)