2016-10-22 6 views
0

主な質問は、関連する外部キーの依存関係

私はどんなUnionステートメントを使用していない、この全体の質問に答えるためにSQL文を必要と合流複数を含む複雑なクエリを記述する必要があります。 AdventureWorks2014データベースでは、どのストアがDavid Campbellと関連付けられているかを調べる必要がありますか?ストア名でソートします。

  • このクエリでは、店舗名と最初/最後を選択項目の最初の項目として表示する必要があります。この問合せは、さまざまな表とそのfk依存関係間の結合を使用して実行する必要があります。

  • 外部キー関係のない結合テーブルは含めないでください。

    Select 
        object_name(t.object_id), Schema_name(t.schema_id), t.name, c.name 
    From 
        sys.tables t 
    Join 
        sys.columns c on t.object_id = c.object_id 
    Where 
        t.name like '%Store%' 
        or c.name like'%Store%' 
    

    これは私が興味のある特定のテーブルを識別してみましょう:

物事は私がスキーマIDを取得し、ストアに関連しているのidのオブジェクトに、このクエリを実行した

を試してみました私が参加することができます。表Sales.CustomerはFK名StoreID & PersonIDと同様に表Sales.StoreStoreNameです。

そこからfkの依存関係を見て、テーブルPerson.Personの最初と最後の名前が見つかりました。

は、残念ながら、私は店がDavid Campbellに関連付けられている隔離することができないよう

Select 
    s.name StoreName, p.FirstName, p.LastName 
From 
    sales.customer c 
Join 
    person.person p On c.personID = p.businessentityID 
Join 
    sales.store s on s.businessentityID = p.businessEntityID 
Where 
    p.FirstName Like ‘%David%’ 
    and p.LastName Like ‘%Campbell%’ 
Order by 
    s.Name 

問題:私は運でこのクエリを試してみました。私は結合が正しくないことを知っていますが、 "On"節と表を正しくリンクしてfkの依存関係に基づいて適切な結果を生成する方法がわかりません。

私はperson.personから2つのレコードがこれを実行することによって関連していることを知っている:

Select * 
From Person.Person 
Where p.FirstName Like '%David%' 
    and p.LastName Like '%Campbell%' 

これは全く分からないが、表Person.Personに 『デヴィッド・キャンベル』に関連付けられているBusinessentityIDの283と609を返します。それらのIDをdavidに関連付けられたストア名にリンクする方法。

基本的に、私のクエリが結果を戻さないようにする結合が具体的にわかりません。必要に応じて試したことについて、より多くの情報を含めることができます。

ヒントとフィードバックをお探しですか?

ありがとうございます!

EDIT:

私の独創的なアプローチがオフになって表示されます。私はSales.Storeの外来キーから始まってそこから行く別のルートに行きました。また、 "David Campbell"に関連付けられたストアをカウントするウィンドウ関数を追加し、ヌルパラメータをwhere句に追加して、名前のないストアを説明しました。ここで

私の最終的な結果である:

select 
    s.Name StoreName, p.FirstName, p.LastName, 
    count(s.BusinessEntityID) Over(Partition by s.salespersonId) as TotalStoresAssociatedWithDavidCampbell   --<38 records show  a "David Campbell" 
from 
    Sales.Store s 
join 
    Sales.SalesPerson sp on s.SalesPersonID = sp.BusinessEntityID 
Join 
    Person.BusinessEntity be on sp.BusinessEntityID = be.BusinessEntityID 
Join 
    Person.Person p on p.BusinessEntityID = be.BusinessEntityID 
where 
    p.FirstName like '%David%' 
    and p.LastName Like '%Campbell%' 
    or s.Name is null 
order by s.Name 

けれども、これは元の質問に対する正しい答えであれば、私は知りません。私はそうだと思いますが、私が確信していれば、それについては気分が良くなります。

答えて

1

私は何かがこの部分の目的と一致していない感じ。この部分では

Join sales.store s On s.businessentityID = p.businessEntityID 

、店がそれを顧客と関係を持っています。人との直接的な関係ではありません。

店の詳細は、 - >店舗の顧客 - >人物の詳細

はしたがって、私はあなたが人に、顧客ではなく、店に店舗を接続する必要がありますね。

DBに接続していないため、このクエリを試していません。これは単なるアイデアです。

select S.Name StoreName, P.FirstName, P.LastName 
from sales.customer C 
join person.person P on P.BusinessEntityID = C.PersonID 
join sales.store S on S.StoreID= C.StoreID 
where P.FirstName = 'David' and P.LastName = 'Campbell' 
order by S.Name 
+0

dav adiありがとうございました。私はクエリを試みたが運がない。私は別のルートを行ったが、私は答えを明らかにしたかもしれないと思う。私の結果が正確かどうかはわかりませんが。 – TheCyberTechnician

2

私は、このリンク

http://i.stack.imgur.com/LMu4W.gifから冒険データベースのスキーマ図を分析し、あなたのqueryjoinが正しいと確認してきました。 問題はSales.Storeテーブルにあります。BusinessEntityIDはPerson.PersonテーブルのBusinessEntityIDと一致していません。その結果、クエリで結果に何も返されなかった理由があります。

+0

あなたは正しいです、フィードバックいただきありがとうございます。元の質問に答えるために取った別のルートで編集しました。私はそれについてまだ100%確信していませんが。 – TheCyberTechnician

関連する問題