SQL Firebird dotaz na kravinku
Uvažujme tento (Firebird) SQL dotaz:
select cast(lsd.OrdNumber as integer), fi.Name, ib_decodedate_day(lsd.Docdate$date) || '.' || ib_decodedate_month(lsd.Docdate$date) || '.' || ib_decodedate_year(lsd.Docdate$date),
lsd.id, lsd.X_ZPRACOVAL_TERMINAL from LogStoreDocuments lsd, Firms fi , logstoredocuments2 where LogStoreDocuments2.Parent_id = LogStoreDocuments2.id and lsd.Firm_ID = fi.ID and lsd.x_zpracoval_terminal <> 'A' and (lsd.documentType = 31 and lsd.x_uzamkl = '' OR lsd.x_uzamkl = '&C6' and Logstoredocuments2.Store_ID = '5100000101' )
Dotaz funguje ale...... !
Protože obsahuje duplicitní řádky, pokouším se je eliminovat doplněním na konec group by:
group by lsd.id
Pak na mě háže tuto chybu: Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
To by byl první dotaz.
A druhý dotaz je, zda lsd.id je příslušné k ostatním řádkům z první tabulky ?!
Protože ty dvě tabulky nejsou spárovány pomocí left join.
Zkoušeli jsme to přes left join, ale dotaz trval neúměrně dlouho.
Ty tam máš tabulky LogStoreDocuments a LogStoreDocuments2?
Ano.
A nemám je tam já, ale návrháři ERP systému.
Netřeba rozvádět, že LogStoreDocuments je tabulka hlaviček dokladů a LogStoreDocuments2 obsahuje jednotlivé položky jednotlivých dokladů.
V tom případě tam nikde nevidím spojení těch dvou tabulek.
To tam taky nevidím
Výsledek se ale tváří konzistentně, stejně jako šéf, který mi s dotazem "pomohl" .
Proto se na to ptám.
Díky za každou radu.
Původní dotaz vypadal takto:
ale potřebovali jsme tam udělat podmínku na sklad, který je uložen až bohužel u příslušných řádků ! (Tedy až u LogStoreDocuments2)
A s touto podmínkou trvá dotaz neúměrně dlouho.
Proč tam spojuješ tabulky STOREDOCUMENTS, FIRMOFFICES a addresses? V původním dotazu je taky nemáš a LogStoreDocuments2 na nich závislá není. Je nutné tam mít left join, nestačil by obyčejný join?
FIRMOFFICES a addresses budu potřebovat dotahovat taky.
V původním dotazu je nemám z důvodu zjednodušení pro rádce.
Tak to přepiš jenom na joiny.