2

Account、、、の3つのテーブルがManagementありManagementAccountLookupます。

アカウントテーブルには場所が含まれています。管理テーブルには、ビジネス階層のすべてのレベルのレコードが含まれています。管理テーブルには、レコードが階層内のどのレベルにあるかを示す値(LevelID)も含まれています。ManagementAccountLookupテーブルは、それらを接続するルックアップテーブルです。

2つの関連する管理レコードを持つすべてのアカウントを取得するためのクエリを作成するのに問題があります。

例:アカウントに5つ以上の管理レコードが関連付けられている場合でも、levelIDがBrandまたはRegionである2つの特定の管理のみを考慮します。また、アカウントを結果グリッドに1回だけ表示したいと思います。

結果セットは次のようになります。

AccountID   Brand      Region
---------   --------   ------
account1    Wendys     East US
account2    McDonalds  West US

これは単純な問題のように思えますが、その結果を得る方法を正確に理解することはできませんでした。自己結合やサブクエリなど、考えられるすべてのことを試しましたが、結果を1行にまとめることができないようです。

どんな助けでもいただければ幸いです。

*編集:ManagementAccountLookupには2つのフィールド(AccountID、ManagementID)があります。これらは、他の2つのテーブルのPKです。
管理には、レコードがブランド、地域、地区などであるかどうかを判断する方法であるLevelID列があります。

ブランドと地域は、管理テーブルの2つの別々の行になります。それらを同じ行に配置するには、結果グリッドが必要です。

4

1 に答える 1

2

1行の情報を取得するには、ManagementAccountLookup/Managementの組み合わせを2回追加する必要があります。LevelID必要に応じて左結合への移行を容易にするために、直接結合に基準を設定しました。

select Account.AccountID,
       m_brand.Name Brand,
       m_region.Name Region
  from Account
 inner join ManagementAccountLookup mal_brand
    on Account.AccountID = mal_brand.AccountID
 inner join Management m_brand
    on mal_brand.ManagementID = m_brand.ManagementID
   and m_brand.LevelID = @Insert_Management_Brand_Level_Here
 inner join ManagementAccountLookup mal_region
    on Account.AccountID = mal_region.AccountID
 inner join Management m_region
    on mal_region.ManagementID = m_region.ManagementID
   and m_region.LevelID = @Insert_Management_Region_Level_Here

編集:すべてのアカウントを表示する必要がある場合は、括弧内に左/内部結合の組み合わせを使用できます:

select Account.AccountID,
       m_brand.Name Brand,
       m_region.Name Region
  from Account
  left join 
  (
       ManagementAccountLookup mal_brand
       inner join Management m_brand
         on mal_brand.ManagementID = m_brand.ManagementID
        and m_brand.LevelID = @Insert_Management_Brand_Level_Here
 )
   on Account.AccountID = mal_brand.AccountID
 left join 
 (
       ManagementAccountLookup mal_region
       inner join Management m_region
          on mal_region.ManagementID = m_region.ManagementID
         and m_region.LevelID = @Insert_Management_Region_Level_Here
 )
    on Account.AccountID = mal_region.AccountID

もう少し読みやすくするために、CTEを使用することができます。

; with mal_level as (
  select AccountID,
         m.LevelID,
         m.Name
    from ManagementAccountLookup mal
   inner join Management m
      on mal.ManagementID = m.ManagementID
)
select Account.AccountID,
       m_brand.Name Brand,
       m_region.Name Region
  from Account
  left join mal_level m_brand
    on Account.AccountID = m_brand.AccountID
   and m_brand.LevelID = @Insert_Management_Brand_Level_Here
  left join mal_level m_region
    on Account.AccountID = m_region.AccountID
   and m_region.LevelID = @Insert_Management_Region_Level_Here

または外部適用

select Account.AccountID,
       b.Brand,
       r.Region
  from Account
 outer apply
 (
       select m_brand.Name Brand
         from ManagementAccountLookup mal_brand
        inner join Management m_brand
           on mal_brand.ManagementID = m_brand.ManagementID
          and m_brand.LevelID = @Insert_Management_Brand_Level_Here
        where mal_brand.AccountID = Account.AccountID
 ) b
 outer apply
 (
       select m_region.Name Region
         from ManagementAccountLookup mal_region
        inner join Management m_region
           on mal_region.ManagementID = m_region.ManagementID
          and m_region.LevelID = @Insert_Management_Region_Level_Here
        where mal_region.AccountID = Account.AccountID
 ) r
于 2012-05-24T01:30:45.403 に答える