0

主な質問

ステートメントを使用せずに、この質問全体に答えるには SQL ステートメントが必要Unionです。データベースで、関連付けられてAdventureWorks2014いるストアを見つける必要がありますか? David Campbellそして店名順に並び替えます。

  • このクエリは、店舗名と、選択した最初のアイテムとして最初/最後を表示する必要があります。このクエリは、さまざまなテーブルとその fk 依存関係の間の結合を使用して実行する必要があります。

  • 外部キー関係のない結合テーブルを含めてはなりません。

私が試したこと

このクエリを実行して、ストアに関連するスキーマ ID とオブジェクト ID を取得しました。

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%'

これにより、参加できる関心のある特定のテーブルを特定できました。Sales.CustomerFK 名StoreID&を持つテーブル、およびcolumn を持つPersonIDテーブル。Sales.StoreStoreName

そこから、fk の依存関係を調べて、 table で姓名を見つけましたPerson.Person。私は運がないこのクエリを試しました:

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

問題

残念ながら、どのストアが に関連付けられているかを特定することはできないようですDavid Campbell。結合が正しくないことはわかっていますが、「On」句とテーブルを正しくリンクして、fk の依存関係に基づいて正しい結果を生成する方法がわかりません。

これを実行すると、person.person の 2 つのレコードが関連付けられていることがわかります。

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

BusinessentityIDこれにより、表の「David Campbell」に関連付けられている の 283 と 609 が返されますPerson.Personが、これらの ID を David に関連付けられている店舗名にリンクする方法がわかりません。

基本的に、クエリが結果を返さない原因となっている結合が具体的にわかりません。必要に応じて、試したことに関する詳細情報を含めることができます。

ヒントとフィードバックを探しています。

ありがとう!

編集:

私の元のアプローチがオフになっているようです。Sales.Store の外部キーから始めて、そこから別のルートに進みました。また、"David Campbell" に関連付けられた店舗をカウントする Windows 関数を追加し、名前のない店舗を説明するために where 句に null パラメーターを追加しました。

ここに私の最終結果があります:

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  

ただし、これが元の質問に対する正しい答えであるかどうかはわかりません。そうだと思いますが、確信が持てたなら、もっと気分が良くなるでしょう。

4

2 に答える 2

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
于 2016-10-22T06:11:36.343 に答える
0

このリンクから冒険データベースのスキーマ図を分析しました

http://i.stack.imgur.com/LMu4W.gifで、queryjoin が正しいことを確認してください。しかし、問題は Sales.Store テーブルにある BusinessEntityID が Person.Person テーブルの BusinessEntityID と一致しないため、クエリが結果に何も返さなかった理由です

于 2016-10-22T06:57:58.443 に答える