Sql server T-SQL:使用多个联接的相同字段

Sql server T-SQL:使用多个联接的相同字段,sql-server,tsql,subquery,Sql Server,Tsql,Subquery,我复习了类似的问题,但找不到具体问题的答案。我在SQLServerManagementStudio中使用SQLServer2008T-SQL,但更习惯于Oracle和CrystalReports 简化场景: 桌上顾客 表1保险范围 表保险公司 表1保险计划 我需要一个报告,基本上一行返回以下内容: 来自客户的几个专栏 保险1-InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line=1 保险2-InsuranceCompany和Ins

我复习了类似的问题,但找不到具体问题的答案。我在SQLServerManagementStudio中使用SQLServer2008T-SQL,但更习惯于Oracle和CrystalReports

简化场景:

桌上顾客

表1保险范围

表保险公司

表1保险计划

我需要一个报告,基本上一行返回以下内容:

来自客户的几个专栏 保险1-InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line=1 保险2-InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line=2 保险3-InsuranceCompany和InsurancePlan表中的列,其中InsuranceCoverage.line=3
我觉得自己很愚蠢,没能弄明白这一点。一个客户最多可以购买三种保险。这将很容易为其编写多个查询,但我必须将其设置为可以每月自动运行1次。我以前在同一个报表中多次使用同一个表,在联接上使用别名,但由于保险覆盖率.line标准,这在这里不起作用,对吗?from子句中的子查询就是答案吗?

您可以将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、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

。。。或者类似的东西:

我设置了一些表变量来显示这个查询是有效的。您需要将它们替换为真正的表名和列名。我相信这样的事情会对你有用:

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

我设置了一些表变量来显示这个查询是有效的。您需要将它们替换为真正的表名和列名。我相信这样的事情会对你有用:

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
像这样的

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
像这样的

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

如果一个客户只有一个ins保险怎么办?@Chris Shain:啊,他说最多有3个保险…,我会修改它。谢谢。如果一个客户只有一个ins保险怎么办?@Chris Shain:啊,他说最多有3个保险…,我会修改它。谢谢。我想这是最好的,以防一些客户没有保险。非常感谢你们。你的回答不仅回答了这个问题,还帮助我解决了另一个问题。这个网站太棒了。我认为这是最好的,以防一些客户没有保险。非常感谢你们。你的回答不仅回答了这个问题,还帮助我解决了另一个问题。这个网站太棒了。