SQL子查询加入三个表

时间:2015-03-12 09:42:59

标签: sql firebird firebird2.5

table schema 我想sql子查询有3个表的信息,不幸的是我有这个错误

  

列不属于引用表。
  动态SQL错误。
  SQL错误代码= -206   专栏未知。
  NOM_CLIENT。
  在第7行第12栏。

`select
           f.fact_n,
           f.fact_dos_n,
           poste_facture,
           montant_produits,
           date_ouverture_dos,
           nom_client,
           adresse_client
        from factures   f
            left outer join
          --detail facture par poste facturation
            ( select
            facture_detail.fact_n,
            facture_detail.factd_poste_fact as poste_facture,
            sum(facture_detail.factd_produits) as montant_produits
            from facture_detail
            GROUP BY facture_detail.fact_n,facture_detail.factd_poste_fact
           )fact_d on (f.fact_n = fact_d.fact_n )
          --information client  et dossier
          left outer join
          --debut niveau dossier
            (select
            dos.dos_n as dos_n,
            dos.dos_date_ouvr as date_ouverture_dos
            from dossiers dos
            left outer join
            --debut niveau client
                     (select
                     cl.cl_n ,
                     cl.cl_nom as nom_client,
                     cl.cl_adresse as adresse_client
                     from clients cl
                     --fin niveau client
                     )cl on(dos.dos_cl_n=cl.cl_n)
            --fin niveau dossier
            )dos on (f.fact_dos_n =  dos.dos_n )
    --fin niveau facture
              where f.fact_n=:AFACT_N`

2 个答案:

答案 0 :(得分:0)

试试这个..

select
           f.fact_n,
           f.fact_dos_n,
           poste_facture,
           montant_produits,
           date_ouverture_dos,
           nom_client,
           adresse_client
        from factures   f
            left outer join
          --detail facture par poste facturation
            ( select
            fd.fact_n,
            fd.factd_poste_fact as poste_facture,
            sum(fd.factd_produits) as montant_produits
            from facture_detail fd
            GROUP BY fd.fact_n,fd.factd_poste_fact
           )fact_d on (f.fact_n = fact_d.fact_n )
          --information client  et dossier
          left outer join
          --debut niveau dossier
            (select
            dos.dos_cl_n as dos_cl_n
            dos.dos_n as dos_n,
            dos.dos_date_ouvr as date_ouverture_dos
            from dossiers dos
            left outer join
            --debut niveau client
                     (select
                     cl.cl_n ,
                     cl.cl_nom as nom_client,
                     cl.cl_adresse as adresse_client
                     from clients cl
                     --fin niveau client
                     )cl on(dos.dos_cl_n=cl.cl_n)
            --fin niveau dossier
            )dos1 on (f.fact_dos_n =  dos1.dos_n )
    --fin niveau facture
              where f.fact_n=:AFACT_N

答案 1 :(得分:0)

你应该inner join而不是left outer join

      select
           f.fact_n,
           f.fact_dos_n,
           poste_facture,
           montant_produits,
           date_ouverture_dos,
           nom_client,
           adresse_client,
           fd.fact_n,
           fd.factd_poste_fact as poste_facture,
           sum(fd.factd_produits) as montant_produits,
           dos.dos_n as dos_n,
           dos.dos_date_ouvr as date_ouverture_dos,
           cl.cl_n ,
           cl.cl_nom as nom_client,
           cl.cl_adresse as adresse_client
        from factures   f
        inner join  facture_detail fd
             on f.fact_n = fd.fact_n
        inner join dossiers dos
             on f.fact_dos_n =  dos.dos_n 
        inner join clients cl
             on dos.dos_cl_n=cl.cl_n
        where f.fact_n=:AFACT_N
            GROUP BY 
           fd.fact_n,fd.factd_poste_fact

注意:

  

Inner join仅生成表A和表B中匹配的记录集。

     

Left outer join从表A中生成一组完整的记录,其中包含表B中的匹配记录(如果可用)。如果没有匹配,则右侧将包含null。

INNER JOIN INNER JOIN

LEFT OUT JOIN LEFT OUT JOIN