2012-03-26 26 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

insPlanID 
insPlanName 
insPlanClass 

我需要一份報告,基本上返回以下的一行:

  1. 數列從Customer
  2. 保險1 - 列從InsuranceCompany和InsurancePlan表,其中InsuranceCoverage.line = 1
  3. 組保險2 - 從InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line = 2
  4. 保險3 - 從InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line = 3

我覺得很愚蠢不能夠想出解決出。一位顧客可能有多達三項保險。這將很容易編寫多個查詢,但我必須設置它,以便它可以自動運行1x /月。我在同一份報告中多次使用同一張表,在之前使用別名,但由於保險標準.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 2012-03-26 20:09:33

+0

非常感謝你們。你的回答不僅回答了這個問題,而且幫助我解決了另一個問題。這個網站真棒。 – 2012-03-27 00:04:10

1

你可以做2 4工會,3,作爲派生表,並加入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

如果客戶只有一個插件,該怎麼辦? – 2012-03-26 20:03:42

+0

切換到左連接。:) – 2012-03-26 20:10:49

+0

@Chris Shain:啊,他說了多達3項保險......,我會修改它。謝謝。 – 2012-03-26 20:11:42

相關問題