使用子查询连接3个表

时间:2018-01-18 10:44:50

标签: sql sql-server join subquery

我有这个问题:

select  IDPersonne, NumeroClientAXA, COUNT(1) as 'NbrDoublons'
from PortefeuillePersonne
group by IDPersonne, NumeroClientAXA
having COUNT(1)>1

我想在这个子查询上加入3个表 我尝试过类似的东西:

select prs.NumeroSocietaire, 
pp.NumeroClientAXA, pp.IDPortefeuille,  pf.Code, pf.Intitule, count(1)
 from PortefeuillePersonne pp
    Join Portefeuille pf
        ON pf.IDPortefeuille = pp.IDPortefeuille
    Join Personne prs
        ON prs.IDPersonne IN (select  IDPersonne
                             from PortefeuillePersonne
                             group by IDPersonne
                             having  COUNT(IDPersonne)>1)

它一直告诉我: 专栏' Personne.NumeroSocietaire'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

你能帮助我吗?

3 个答案:

答案 0 :(得分:0)

假设您希望记录中包含多条PortefeuillePersonne条记录,则应将其更改为以下内容:

select prs.NumeroSocietaire, pp.NumeroClientAXA, pp.IDPortefeuille,  pf.Code,
    pf.Intitule, count(pp.IDPersonne)
from PortefeuillePersonne pp
    Join Portefeuille pf
        ON pf.IDPortefeuille = pp.IDPortefeuille
    Join Personne prs
        ON prs.IDPersonne = pp.IDPersonne
group by prs.NumeroSocietaire, pp.NumeroClientAXA, pp.IDPortefeuille,  pf.Code,
    pf.Intitule
having  COUNT(pp.IDPersonne)>1

select列表中的任何字段都必须聚合或包含在SQL Server中的group by中。

答案 1 :(得分:0)

Select    prs.NumeroSocietaire
        , pp.NumeroClientAXA
        , pp.IDPortefeuille
        , pf.Code
        , pf.Intitule
        , count(1)
from        PortefeuillePersonne pp
Inner Join (    select      IDPersonne
                from        PortefeuillePersonne
                group by    IDPersonne
                having      COUNT(IDPersonne)>1
            ) p1            ON pp.IDPersonne = P1.IDPersonne
Inner Join Portefeuille pf  ON pf.IDPortefeuille = pp.IDPortefeuille
Inner Join Personne prs     ON prs.IDPersonne = pp.IDPersonne
GROUP BY  prs.NumeroSocietaire
        , pp.NumeroClientAXA
        , pp.IDPortefeuille
        , pf.Code
        , pf.Intitule

答案 2 :(得分:0)

这不是有效的join尝试;

ON prs.IDPersonne IN (select  IDPersonne
                     from PortefeuillePersonne
                     group by IDPersonne
                     having  COUNT(IDPersonne)>1)

您应该将子选择作为一个集合加入,因此完整的查询应该是这样的;

select prs.NumeroSocietaire, pp.NumeroClientAXA, pp.IDPortefeuille,  pf.Code, pf.Intitule, count(1) 
from PortefeuillePersonne pp
join Portefeuille pf ON pf.IDPortefeuille = pp.IDPortefeuille
join (select IDPersonne
             from PortefeuillePersonne
             group by IDPersonne
             having  COUNT(IDPersonne)>1) A ON A.IDPersonne = prs.IDPersonne
group by prs.NumeroSocietaire, pp.NumeroClientAXA, pp.IDPortefeuille,  pf.Code, pf.Intitule