2016-11-09 11 views
0

私はSQL学習を始めたばかりで、オンラインでいくつかの練習問題をやっています。 私は(ページ上の#11)、ここでこの問題に出くわした:http://sqlzoo.net/wiki/AdventureWorks_hard_questionsSQL:条件に基づいて同じデータソースから2つの列を作成する方法は?

ここでは、この問題のために使用される3つのテーブルのスキーマがあります:

CustomerAW(得意先、姓、MiddleName、姓、会社名、EmailAddressのは)

CustomerAddress(得意先、あるAddressId、AddressTypeに)

住所(追加しますressID、住所1、住所2、市、はStateProvince、CountyRegion、郵便番号)

そして質問です:

すべての顧客のためにダラスショー「本社」の住所1と住所1の中に「本社」で「配送先」住所 - 配送先住所がない場合は空白のままにします。顧客あたり1行を使用します。以下は

そうに私のコードです:

以下
SELECT CustomerID, AddressType, AddressLine1 
FROM CustomerAW 
JOIN CustomerAddress 
USING (CustomerID) 
JOIN Address 
USING (AddressID) 
WHERE AddressType IN 'Main Office' 
AND City = 'Dallas' 
; 

は、私が手に出力されます:

Result: 
CustomerID AddressType AddressLine1 
112   Main Office P.O. Box 6256916 
130   Main Office Po Box 8259024 
165   Main Office 2500 North Stemmons Freeway 
201   Main Office Po Box 8035996 
256   Main Office 99828 Routh Street, Suite 825. 

しかし、私は別の列に配送先住所を表示する方法がわかりません。 となり、ヘッダーは "CustomerID、AddressType、MainOfficeAddress、ShippingAddress"になります。この問題に記載されているように、配送先住所がない場合は空白のままにしてください。 "ビュー" を使用せずにこれを行う方法

更新

?私は、私はそれらのいずれかがでサブクエリを書くことで、まあ、私はこれを達成するためのさまざまな方法を試してみた

を試してみました

何...私は、ビューを作成することはできませんでテストしていますウェブサイトSELECTステートメント:

SELECT c.CustomerID, 
(
SELECT a.AddressLine1 FROM Address a 
JOIN CustomerAddress ca 
USING (AddressID) 
WHERE ca.AddressType = 'Main Office' 
) AS MainOfficeAddress 
FROM CustomerAW c 
; 

しかし、「サブクエリは1行以上を返します」というエラーが表示されます。

SELECT c.CustomerID, b.AddressLine1, e.AddressLine1 
FROM CustomerAW c 
JOIN 
(
SELECT * FROM CustomerAddress ca 
JOIN Address a 
USING (AddressID) 
WHERE ca.AddressType IN 'Main Office' 
) AS b 
USING (CustomerID) 
JOIN 
(
SELECT * FROM CustomerAddress ca 
JOIN Address a 
USING (AddressID) 
WHERE ca.AddressType IN 'Shipping' 
) AS e 
USING (CustomerID) 
; 

そして:私はまた、以下のようなもの(それらのどれも実際に動作していない)試した

SELECT c.CustomerID, AddressType, AddressLine1 AS MainOfficeAddress, 
(
    SELECT a.AddressLine1 FROM Address a 
    JOIN CustomerAddress ca USING (AddressID) 
    WHERE ca.CustomerID IN c.CustomerID 
    AND ca.AddressType = 'Shipping' 
) AS ShippingAddress 
FROM CustomerAW c 
JOIN CustomerAddress ca 
USING (CustomerID) 
JOIN Address 
USING (AddressID) 
WHERE ca.AddressType IN ('Main Office') 
AND City = 'Dallas' 
; 

をすべてのヘルプは大歓迎です!私は愚かな質問をしていないことを願っています。

答えて

1

「内部結合」を使用する必要があります。 私が書く、その後

create view ee as 
(
    SELECT CustomerID, AddressType, AddressLine1 
    FROM CustomerAW 
    JOIN CustomerAddress 
    USING (CustomerID) 
    JOIN Address 
    USING (AddressID) 
    WHERE AddressType IN 'Main Office' 
    AND City = 'Dallas' 
) ; 

を意味し、簡単にするためにビューを作成し、上記と同じコードを書きます...

create view rr as 
    (
    SELECT CustomerID, AddressType, AddressLine1 
    FROM CustomerAW 
    JOIN CustomerAddress 
    USING (CustomerID) 
    JOIN Address 
    USING (AddressID) 
    WHERE AddressType IN 'Shipping Address' 
    ); 

その後、内側のはこれが助けたビューEEおよびRR

select CustomerID, AddressType, MainOfficeAddress, ShippingAddress 
from ee 
inner join 
rr 
on ee.customerID=rr.CustomerID 

希望の参加取る....;)

+0

こんにちはTanuj、答えるためにどうもありがとうございます!私は "ビュー"を使ってこのwitoutをどうやって達成できるのか尋ねてもよろしいですか?また、最初に "ビュー"を使用してヒアリングをすると、あなたはビューを少し拡大できますか?私は、あなたがビューを「見る」ためにもっと多くのものを考えていましたが、クエリでは使用されませんでした。 – alwaysaskingquestions

+0

ビューは仮想テーブルであり、実際のテーブルを参照しています。いくつかのデータを格納します。ビューが宣言されると、それはテーブルのように使用できます。 –

+0

私は参照してください。新しいテーブルを作成したり、サブクエリを使用したりするために、代わりにここでビューを使用しています。ビューは一時的にメモリに保存され、次にプルしようとすると次回は表示されません。私はそれを正しく理解していますか? – alwaysaskingquestions

関連する問題