2017-09-08 17 views
2

私はSQL Server 2016を使用しています。私はCASEでselect文を使用しています。このCASEは国コードを返します。同じselectステートメントで、この国コードと一緒になる説明を取得するために別のテーブルを照会したいと思います。これを行うために、サブクエリーを作成しました。このサブクエリでは、where-clauseのケースの結果を使用したいと思います。SQL(サーバー2016) - サブクエリのwhere句としてCASEの結果を使用する

SELECT 
     DelAddrCode 
    , CASE WHEN DelAddrCode = '0' THEN (SELECT Customeraddress.countrycode FROM Customeraddress WHERE Customeraddress.CustID = Salesorder.CustID) 
            ELSE (SELECT Deliveryaddress.countrycode FROM Deliveryaddress where Deliveryaddress.CustID = Salesorder.CustID AND Deliveryaddress.DelAddrCode = Salesorder.DelAddrCode) 
      END AS delivery_country 
    , (SELECT country.description from Country WHERE Country.countrycode = delivery_country) 
FROM Salesorder 

ここで論理は、米国内のインスタンスのために、デフォルトの顧客のアドレスを持っているということですが、あなたは、英国のような別のアドレスに販売注文を配信することができます。最初にDelAddrCodeを取得します。 0の場合は、CustomerAddressテーブルから国コードを取得します。 0でなければ、Deliveryaddressテーブルから国コードを取得します。

私はcountrycodeを持っているので、Countryテーブルから国の説明を取得したいと思います。私はこれのためにサブクエリを使用します。しかし、このサブクエリのwhere節は、CASEの結果に依存します。上記のクエリでエラーが発生しました: "無効な列名 'del_country'"。

私が見つけた解決策は、ケースを過ぎてコピーし、サブクエリでそれを置くことです:

SELECT 
     DelAddrCode 
    , CASE WHEN DelAddrCode = '0' THEN (SELECT Customeraddress.countrycode FROM Customeraddress WHERE Customeraddress.CustID = Salesorder.CustID) 
            ELSE (SELECT Deliveryaddress.countrycode FROM Deliveryaddress where Deliveryaddress.CustID = Salesorder.CustID AND Deliveryaddress.DelAddrCode = Salesorder.DelAddrCode) 
      END AS delivery_country 
    , (SELECT country.description from Country WHERE Country.countrycode = 
      (CASE WHEN DelAddrCode = '0' THEN (SELECT Customeraddress.countrycode FROM Customeraddress WHERE Customeraddress.CustID = Salesorder.CustID) 
              ELSE (SELECT Deliveryaddress.countrycode FROM Deliveryaddress WHERE Deliveryaddress.CustID = Salesorder.CustID and Deliveryaddress.DelAddrCode = Salesorder.DelAddrCode) 
        END)) 
    FROM Salesorder 

これは私が欲しい結果を与えるが、それは、コード混乱になります。サブクエリのCASEの結果を参照して、同じCASEをもう一度コピー&ペーストしなくても同じ結果を得る方法はありますか?

ありがとうございます!

+0

「JOIN」について聞いたことがありますか? –

答えて

2

次のコードを試してください。それはCASEを1回だけ含んでいます。

SELECT t.delAddrCode, 
     country.description 
FROM 
(
    SELECT Salesorder.DelAddrCode, 
      CASE 
       WHEN Salesorder.DelAddrCode = '0' THEN Customeraddress.countrycode 
       ELSE Deliveryaddress.countrycode 
      END AS delivery_country 
    FROM Salesorder 
    LEFT JOIN Customeraddress ON Customeraddress.CustID = Salesorder.CustID 
    LEFT JOIN Deliveryaddress ON Deliveryaddress.CustID = Salesorder.CustID 
      AND Deliveryaddress.DelAddrCode = Salesorder.DelAddrCode 
) t 
LEFT JOIN Country ON country.countrycode = t.delivery_country; 
0

外アドレステーブルを結合し、COALESCEと一致する1次を参照してください。(私は仮定している)0にはできません

SELECT 
    DelAddrCode, 
    COALESCE(ca.countrycode, da.countrycode) AS countrycode, 
    c.description 
FROM Salesorder so 
LEFT JOIN Customeraddress ca ON ca.CustID = so.CustID AND so.DelAddrCode = 0 
LEFT JOIN Deliveryaddress da ON da.CustID = so.CustID AND da.DelAddrCode = so.DelAddrCode 
JOIN country c ON c.countrycode = COALESCE(ca.countrycode, da.countrycode); 

Deliveryaddress.DelAddrCode場合、あなたもこの

JOIN country c ON c.countrycode IN (ca.countrycode, da.countrycode); 

を作ることができますよりシンプルなリンクとなるためのより良い実行計画につながる可能性があります。

関連する問題