2012-03-26 14 views
1

類似の質問をレビューしましたが、特定の質問に対して答えが見つかりませんでした。私はSQL Server 2008(SQL Server Management StudioのT-SQL)で作業していますが(OracleやCrystal Reportsにははるかに慣れています)T-SQL:複数の結合を使用する同じフィールド

簡易シナリオ:

カスタマー

customerID (pk)... 

InsuranceCoverage

customerID (composite pk) 
line (composite pk) 
insCompanyID (fk) 
insPlanID (fk) 

InsuranceCompany

insCompanyID 
insCompanyName 
insCompanyAddr 

InsurancePlan私は基本的に1行で次のように返すレポート必要

insPlanID 
insPlanName 
insPlanClass 

Customer

  • 保険1から

    1. いくつかの列 - InsuranceCompanyとから列をInsurancePlanテーブル(InsuranceCoverage.line = 1)
    2. 保険2 - InsuranceCoverage.line = 2
    3. InsuranceCompanyとInsurancePlanのテーブルの列保険3 - InsuranceCoverage.line = 3

    InsuranceCompanyとInsurancePlanのテーブルの列私はこれを理解することができない非常に愚かな感じでる。 1人の顧客が最大3つの保険を持つことがあります。これは複数のクエリを書くのは簡単でしょうが、自動的に1x /月に実行できるように設定する必要があります。私は前回のジョインでエイリアスを使用して、同じレポートで同じテーブルを複数回使用しましたが、InsuranceCoverage.line基準のためにここでは機能しません。 from句のサブクエリは答えですか?

  • 答えて

    2

    このようなことは?

    SELECT 
        c.CustomerID, 
        cov1.*, 
        cov2.*, 
        cov3.*, 
        insco1.insCompanyName as insCompanyName1, 
        insco2.insCompanyName as insCompanyName2, 
        insco3.insCompanyName as insCompanyName3, 
        etc... 
    FROM 
        Customer c 
        LEFT OUTER JOIN InsuranceCoverage cov1 on cov1.CustomerID = c.CustomerID AND cov1.line = 1 
        LEFT OUTER JOIN InsuranceCoverage cov2 on cov2.CustomerID = c.CustomerID AND cov2.line = 2 
        LEFT OUTER JOIN InsuranceCoverage cov3 on cov3.CustomerID = c.CustomerID AND cov3.line = 3 
        JOIN InsuranceCompany insco1 on insco1.insCompanyID = cov1.insCompanyID 
        JOIN InsuranceCompany insco2 on insco2.insCompanyID = cov2.insCompanyID 
        JOIN InsuranceCompany insco3 on insco3.insCompanyID = cov3.insCompanyID 
        JOIN InsurancePlan inspl1 on inspl1.insPlanID = cov1.insPlanID 
        JOIN InsurancePlan inspl2 on inspl2.insPlanID = cov2.insPlanID 
        JOIN InsurancePlan inspl3 on inspl3.insPlanID = cov3.insPlanID 
    
    +0

    私は、これは、一部の顧客に保険が適用されない場合に最適だと思います。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

    +0

    皆さんありがとうございました。あなたの回答はこの質問に答えるだけでなく、別の問題を解決するのにも役立ちました。このサイトは最高です。 –

    1

    あなたのような、派生テーブルとして2、3、4の結合を行うと、それと1に参加することができます...

    select t1.a,t1.b,t1.c, t2.d, t2.e, t2.f from customer t1, 
    (select fk, d as d, 0 as e, 0 as f from ic where line=1 
        union select fk, 0, e, 0 from ic where line=2 
        union select fk, 0, 0, f from ic where line=3) as t2 
    where t1.pk = t2. fk 
    

    その

    編集のようなもの:ああ、右、もし彼らはその後、...のような参加左に

    select t1.a,t1.b,t1.c, t2.d, t2.e, t2.f from customer t1 left join 
    (select fk, d as d, 0 as e, 0 as f from ic where line=1 
        union select fk, 0, e, 0 from ic where line=2 
        union select fk, 0, 0, f from ic where line=3) as t2 
    on t1.pk = t2.fk 
    

    ...またはそのような何か:)

    2

    I Sを、それを変更一切保険を持つことはできませんこのクエリが動作することを示すためにいくつかのテーブル変数を追加します。実際のテーブル名とカラム名で置き換える必要があります。私はこのようなものがあなたのために働くと信じています:

    DECLARE @Customer TABLE (CustomerId INT) 
    
    DECLARE @InsuranceCoverage TABLE 
    (
        CustomerId INT 
        , Line INT 
        , InsuranceCompanyId INT 
        , InsurancePlanId INT 
    ) 
    
    DECLARE @InsuranceCompany TABLE 
    (
        Id INT 
        , Name VARCHAR(100) 
        , Addr VARCHAR(100) 
    ) 
    
    DECLARE @InsurancePlan TABLE 
    (
        Id INT 
        , Name VARCHAR(100) 
        , Class VARCHAR(100) 
    ) 
    
    SELECT 
        C.* -- Customer colums. 
        -- Insurance1 columns. 
        , ICmp1.* 
        , IP1.* 
        -- Insurance2 columns. 
        , ICmp2.* 
        , IP2.* 
        -- Insurance3 columns. 
        , ICmp3.* 
        , IP3.* 
        FROM 
        @Customer C 
        LEFT JOIN @InsuranceCoverage ICov1   
         INNER JOIN @InsuranceCompany ICmp1 
          ON ICmp1.Id = ICov1.InsuranceCompanyId 
         INNER JOIN @InsurancePlan IP1 
          ON IP1.Id = ICov1.InsurancePlanId 
         ON ICov1.CustomerId = C.CustomerId 
         AND ICov1.Line = 1 
        LEFT JOIN @InsuranceCoverage ICov2 
         INNER JOIN @InsuranceCompany ICmp2 
          ON ICmp2.Id = ICov2.InsuranceCompanyId 
         INNER JOIN @InsurancePlan IP2 
          ON IP2.Id = ICov2.InsurancePlanId 
         ON ICov2.CustomerId = C.CustomerId 
         AND ICov2.Line = 2 
        LEFT JOIN @InsuranceCoverage ICov3 
         INNER JOIN @InsuranceCompany ICmp3 
          ON ICmp3.Id = ICov3.InsuranceCompanyId 
         INNER JOIN @InsurancePlan IP3 
          ON IP3.Id = ICov3.InsurancePlanId 
         ON ICov3.CustomerId = C.CustomerId 
         AND ICov3.Line = 3 
    
    +2

    お客様が1つのインプレッションを持っている場合はどうなりますか? –

    +0

    左の結合に切り替えます。:) –

    +0

    @Chris Shain:ああ、彼は最高3つの保険を言った... ...私はそれを修正します。ありがとう。 –

    関連する問題