none
Select v sql

    Obecná diskuse

  • Dobrý den,

     

    Mám dotaz(viz.níže), který sice funguje ale nedělá přesně co bych si představoval. Dotaz mi vyjede reditel – ASM – OZ – Firma – prodejna – sortiment. Bohužel sortiment neobsahuje všechny položky z tabulky akce_polozky. Myslel jsem, že když použiji left John, že by to mělo zobrazovat všechny položky i nulové, které nejsou ve vystavene_faktury_akce.

     

    Prosím o pomoc



      SELECT                q.ASM + ' - ' + q.NAZEV as reditel,
                                 r.ASM + ' - ' + r.NAZEV as aesemko,
                                 d.OZ + ' - ' + d.NAZEV as obchodak,
                                 o.NAZEV_FIRMA + ' - ' + o.MESTO_FIRMA + ' - ' + o.ICO AS firma,        
                                 o.CISLO + ' - ' + o.MESTO + ' ,' + o.ULICE  AS prodejna,
                                 t.NAZEV + ' - ' + t.OBICIS AS sortiment,
                                SUM(isnull(f.PRODEJNI_CENA_CELKEM,0)) AS cena,
                                SUM(isnull(f.KUSY, 0)) AS kusy
      FROM         vystavene_faktury_akce f
     
     Left Join    (Select aa.akce_id, aa.obicis from akce_polozky as aa
    inner join akce as a on aa.akce_id = a.akce_id
     join sortiment as t on aa.obicis = t.obicis) as aa on
    aa.obicis = f.obicis
    and f.akce_id = aa.akce_id

    INNER JOIN   SORTIMENT t ON t.OBICIS = f.OBICIS and t.obicis = aa.obicis
    INNER JOIN   ODBERATELE o ON f.ICO_CISLO = o.ICO_CISLO 
    INNER JOIN   SORTIMENT t ON t.OBICIS = f.OBICIS 
    INNER JOIN   AKCE a ON a.AKCE_ID = f.AKCE_ID and a.akce_id = aa.akce_id
    INNER JOIN   DISTRIBUTOR as r on o.ASM_ID = r.ASM_ID
    INNER JOIN   DISTRIBUTOR as q on o.ORED_ID = q.ASM_ID 
    INNER JOIN   DEALER AS d ON o.OZ_ID = d.OZ_ID  
    INNER JOIN   MALOOBCHODNI_SIT s ON s.MOSIT_ID = o.MOSIT_ID 
    WHERE (f.DATUM_ZDAN_PLNENI >= '2010-01-10')
        AND (f.DATUM_ZDAN_PLNENI <= '2010-01-20')
        AND (o.MOSIT_ID = 19)
        AND (a.AKCE = 'TOP/01/10')
        AND f.DRUHPS IN ('S', 'C')
      GROUP BY
               q.ASM,         
               q.NAZEV,
               r.ASM,
               r.NAZEV,
               d.OZ,
               d.NAZEV,
               o.NAZEV_FIRMA,
               o.MESTO_FIRMA,
               o.ICO,
               o.CISLO,
               o.MESTO,
               o.ULICE,
               t.NAZEV,
               t.OBICIS

    14. března 2010 13:47

Všechny reakce

  • Dobry den,

    spojeni tabulek typu 
    Table1 as l LEFT OUTER JOIN Table2 as r on condition
    zajisti, ze vysledny result set bude obsahovat vsechny radky z leve tabulky (v tomto pripade Table1), tedy i ty, pro ktere se v prave tabulce (Table2) nenasel korespondujici zaznam dle spojovaci podminky. Leva tabulka je ta vlevo od klicoveho slova JOIN. Pokud potrebujete vsechny radky z prave tabulky, coz je zrejme jadro Vaseho problemu, pouzijte misto slova LEFT slovo RIGHT - dostanete tak vsechny radky z prave tabulky.

    S pozdravem

    Miloslav Peterka
    14. března 2010 18:56
  • RIGHT JOIN zobrazí úplně stejně záznamů. Budu muset překopat dotaz, protože tohle není ta správná varianta.
    15. března 2010 12:53
  • Aby Vam to fungovalo, je treba znenit vsechna vnitrni spojeni s tabulkou  vystavene_faktury_akce f na vnejsi...

    MP.
    15. března 2010 19:36
  • Vnitřní spojení je myšleno mezi Left join anebo všude od From až po where... Osobně si  myslím, že chybu mám pořád v left join....
    15. března 2010 21:11
  • Pole v tabulce vystavene_faktury_akce pouzivate i ve spojovaci podmince jinych vnitrnich spojenich (INNER JOIN), nejen v onom prvnim LEFT JOIN. Vnitrni spojeni pritom zpusobi, ze do vysledku dostanete jen ty radky, ktere se sparovaly. Pokud tedy chcete mit ve vysledku i radky, ke kterym neni korespondujici radek v tabulce vystavene_faktury_akce, musite s touto tabulkou delat vzdy spojeni vnejsi. A protoze ji mate vlevo a z prave tabulky chcete i ty radky, ktere v tabulce vystavene_faktury_akce nic nemaji, pouzijte RIGHT OUTER JOIN vsude tam, kde mate s touto tabulkou spojeni vnitrni...

    MP.
    16. března 2010 13:22