私は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をもう一度コピー&ペーストしなくても同じ結果を得る方法はありますか?
ありがとうございます!
「JOIN」について聞いたことがありますか? –