Newsgroup: it.comp.lang.delphi
Titolo: Fitri su piu tabelle

Salve a tutti! Ho inserito la seguente istruzione sql in una query. Devo
filtrare la tabella promozioni in base alla tabella che contiene le righe.
Il mio scopo č di prendere tutte le promozioni nelle cui righe il flag
"assegnato" sia falso.
Conquesta istruzioni su un db Promozioni di 1000 e piu promozioni e un db
RPromozioni con piu di 3000 righe mi impiega quasi un minuto prima di aprire
la form. E', secondo voi, sbagliata la mia sql? C'č un modo diverso per
eseguire questo filtro?
GRAZIE IN ANTICIPO
Select *
from Promozioni
Where Exists
(SELECT  RPromozioni.CodAzienda, RPromozioni.CodPVendita,
    RPromozioni.CodLavoro,RPromozioni.AziendaLiquidata,RPromozioni.Assegnato
  FROM RPromozioni
  WHERE ((Promozioni.CodAzienda = RPromozioni.CodAzienda)
  AND   (Promozioni.CodPVendita = Rpromozioni.CodPVendita)
  AND   (Promozioni.CodLavoro = Rpromozioni.CodLavoro)
  AND   (RPromozioni.Assegnato = False)))

GRAZIE IN ANTICIPO
Prova cosě se il database che usi non supporta la JOIN
SELECT Promozioni.*, RPromozioni.CodAzienda, RPromozioni.CodPVendita,
   RPromozioni.CodLavoro,RPromozioni.AziendaLiquidata,RPromozioni.Assegnato
FROM Promozioni, RPromozioni
WHERE (Promozioni.CodAzienda = RPromozioni.CodAzienda)
  AND   (Promozioni.CodPVendita = Rpromozioni.CodPVendita)
  AND   (Promozioni.CodLavoro = Rpromozioni.CodLavoro)
  AND   (RPromozioni.Assegnato = False)
Oppure con la JOIN prova cosě
SELECT Promozioni.*, RPromozioni.CodAzienda, RPromozioni.CodPVendita,
   RPromozioni.CodLavoro,RPromozioni.AziendaLiquidata,RPromozioni.Assegnato
FROM Promozioni JOIN RPromozioni ON (Promozioni.CodAzienda =
RPromozioni.CodAzienda)
  AND   (Promozioni.CodPVendita = Rpromozioni.CodPVendita)
  AND   (Promozioni.CodLavoro = Rpromozioni.CodLavoro)
WHERE  (RPromozioni.Assegnato = False)
Ciao
   Mario

>
[...]Devo filtrare la tabella promozioni in base alla tabella che contiene
le righe.
Il mio scopo è di prendere tutte le promozioni nelle cui righe il flag
"assegnato" sia falso.
Conquesta istruzioni su un db Promozioni di 1000 e piu promozioni e un db
RPromozioni con piu di 3000 righe mi impiega quasi un minuto prima di aprire
la form. [...]
Select *
from Promozioni
Where Exists
(SELECT  RPromozioni.CodAzienda, RPromozioni.CodPVendita,
    RPromozioni.CodLavoro,RPromozioni.AziendaLiquidata,RPromozioni.Assegnato
  FROM RPromozioni
  WHERE ((Promozioni.CodAzienda = RPromozioni.CodAzienda)
  AND   (Promozioni.CodPVendita = Rpromozioni.CodPVendita)
  AND   (Promozioni.CodLavoro = Rpromozioni.CodLavoro)
  AND   (RPromozioni.Assegnato = False)))
<<
Non ne sono certo, ma potrebbe essere + veloce facendo un join sulle due
tabelle.
SELECT P.* FROM Promozioni P  // o elenco campi al posto di P.*
  INNER JOIN RPromozioni RP
    ON ((P.CodAz = RP.CodAz) AND (....) )
  WHERE (RP.Assegnato = "False")
hth
Paolo Arosio

   AND   (RPromozioni.Assegnato = False)))
se non usi paradox questa e' piu' veloce:
select Promozioni.*
from
  RPromozioni left join Promozioni on (
  Promozioni.CodAzienda = RPromozioni.CodAzienda
   AND   Promozioni.CodPVendita = Rpromozioni.CodPVendita
   AND   Promozioni.CodLavoro = Rpromozioni.CodLavoro)
where
  RPromozioni.Assegnato = False
ovviamente devi avere gli indici
- RPromozioni(Assegnato)
- Promozioni(CodAzienda, CodPVendita, CodLavoro)
* ti sconsiglio di usare campi boolean (usi access vero?),
non sono SQL standard.