MYSQL - 左连接有问题

时间:2010-12-01 09:25:17

标签: mysql left-join

我正在寻找动态生成查询的Java swing(它不是我的代码)中的错误。 对于大查询感到抱歉,但我要在此处报告:

select  
b.CodiceCommercialeRiferimento as "Comm. Rif.",
b.PartitaIVA as "PartitaIVA",
b.FlgBusteCartotecnica as "Tipo Prodotto",
b.ClasseMerceologica as "Cl.Merc.",
Periodo0.V as Periodo0,
Periodo3.V as Periodo3,
Periodo4.V as Periodo4  
from (          
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento,
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica        
    from bolle                                                              
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'         
) as b  left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,              
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
        from bolle              
        inner join bollevalori on bolle.recordid = bollevalori.recordid         
        left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
        inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
        left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
        where  
            CommercialeRiferimento in ('001')  
            and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
            and  bolle.FlgBusteCartotecnica in ('B','C')  
            and  bolle.ClasseMerceologica  like '%%'                
            and DataFattura between '2010-01-01' and  '2010-11-30' 
        Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo0 on 
    b.CommercialeRiferimento = Periodo0.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo0.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo0.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo0.ClasseMerceologica  
left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,              
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
    from bolle              
    inner join bollevalori on bolle.recordid = bollevalori.recordid         
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'                
        and DataFattura between '2008-01-01' and  '2008-11-30' 
    Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo3 on 
    b.CommercialeRiferimento = Periodo3.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo3.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo3.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo3.ClasseMerceologica  
left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,              
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
    from bolle              
    inner join bollevalori on bolle.recordid = bollevalori.recordid         
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI 
    on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'                
        and DataFattura between '2008-01-01' and  '2008-12-31' 
    Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo4 on 
    b.CommercialeRiferimento = Periodo4.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo4.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo4.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo4.ClasseMerceologica 
where 
    Periodo0.V is not null 
    or Periodo3.V is not null 
    or Periodo4.V is not null 
Group by b.CommercialeRiferimento,b.PartitaIVA,b.FlgBusteCartotecnica,b.ClasseMerceologica;

查询更大,我减少了它以便保持问题。 结果如下:

"Comm. Rif."    PartitaIVA      "Tipo Prodotto" Cl.Merc.                              Periodo0  Periodo3    Periodo4
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"   2199544.40      NULL        NULL
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"   3627807.30      NULL        NULL
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Prodotti finiti buste/sacchetti   B"   8007.80         NULL        NULL

所以我最后两列是空的(NULL),而我期望一些值。我试图删除最后的sql代码(分组依据),令人惊讶的是我得到了:

"Comm. Rif."    PartitaIVA      "Tipo Prodotto" Cl.Merc.                              Periodo0  Periodo3    Periodo4
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"   3627807.30     NULL     NULL        
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Prodotti finiti buste/sacchetti   B"   8007.80        NULL     NULL    
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"   2199544.40     NULL     NULL    
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"      NULL     3714106.25  4210464.05
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"      NULL     2080109.06  2487643.18

似乎分组......不分组! :-(任何想法?

1 个答案:

答案 0 :(得分:0)

分组依据与聚合函数一起使用,此查询没有。

如果您执行类似以下的查询:

select a, b, c from a_table group by a, b

你会得到:

  • a和b列的不同值

  • c

  • 的未确定值

这就是为什么“分组不分组”,这不是你怎么做的。