Newsgroup: it.comp.lang.visual-basic
Titolo: Clausula WHERE a = b+c

Scusate se è un po' OT l'sql ma lo devo fare da VB :)
Avrei bisogno di fare una select del tipo:
Tabella Pippo
  IDPippo
  Campo
Tabella Pluto
  CampoB
  CampoC
  Descriz
In pratica Pippo.Campo= Pluto.CampoB & Pluto.CampoC
Sono definiti come stringhe.
Ad esempio ho Campo = 090a11b e quindi CampoA=090a, CampoB=11b
Cercando ho trovato di mettere
WHERE "CAMPO" = "CAMPOB" || "CAMPOC"
Ma su appena 300 record ci sta 4minuti ad eseguire la query :\
Ho provato con && ma Interbase non lo conosce...
Avete qualche consiglio?
Grazie :D

 Scusate se č un po' OT l'sql ma lo devo fare da VB :)

Hai presentato la struttura di due tabelle, senza chiarire cosa ti serve
ottenere.
Come primo consiglio, suggerisco di spiegarti meglio.
Ad esempio, postare la query che avevi testato sarebbe stato un bell'inizio.
Alberto
--
E tutto mi sembrava andasse bene...

 Ad esempio, postare la query che avevi testato sarebbe stato un
bell'inizio.
Allora in pratica ho una maschera dove posso filtrare dei dati per una
stampa.
Un tipo di filtro è per CodZona che sta in una tabella di Comuni.
Purtroppo non ha un ID, e l'unico riferimento è un codice che ho che però mi
ritrovo in Comuni come concatenamento di 2 campi.
Quindi
Tabella Principale:
    CodiceComune string*9 (123456xxx)
    altri campi
Comuni
    CodA string*6    (123456)
    CodB string*3    (xxx)
    CodZona    (può essere 1, 2 o 3 o qualche altro numero)
Io devo prendermi tutta la roba con CodZona = al filtro della maschera (es
CodZona=3)
Quindi dovrei fare
SELECT tutta la roba
FROM TabellaPrincipale, Comuni
WHERE TabellaPrincipale.CodiceComune = Comuni.CodA || Comuni.CodB AND
Fcomuni.CodZona='3'
Ci sono anche altre tabelle interrogate, ma in nessuna ho un campo che mi
faccia prendere il codice del comune direttamente.
Questo è quello che dovrei fare :D
Grazie ;)

 Fcomuni.CodZona='3'
La query testata č minimale (con 1 solo campo)  ed ha impiegato comunque 4
minuti (comunque ha funzionato):
SELECT "IDTabPrinc"
FROM TabPrinc, FComuni
WHERE TabPrinc.IDTabPrinc < '300' AND TabPrinc.CODCOMUNERES = FComuni.CODA
|| FComuni.CODB

>> FComuni.CODB
Non uso il tuo dbms, ma credo che un join fatto così sia quanto di meno
ottimizzabile ci sia.
Di fatto, stai chiedendo un Full Outer Join fra due tabelle, scartando i
record composti non soddisfacenti, ma solo alla fine dell'elaborazione.
Considerando che la tabella dei comuni ha qualche migliaio di record,
capisci anche tu quale sia la complessità del prodotto cartesiano.
Se il tuo Sql lo supporta (e ne sono certo), ti consiglio di usare un Inner
Join:
Select <campi>
From TabPrinc Inner Join FComuni
    On TabPrinc.CODCOMUNERES = FComuni.CODA || FComuni.CODB
WHERE <campo_filtro> = Condizione
Una cosa ulteriormente migliorativa delle performance, che in questo caso si
può applicare, ma che non usano in molti, è sostituire il WHERE con un AND,
in modo da inserire il filtro già nel Join.
Se anche così le performance restano scarse, ti suggerisco di forzare un
indice sui campi chiave della tabella comuni.
Ciao


 record composti non soddisfacenti, ma solo alla fine dell'elaborazione.
Concordo pienamente, è vero che 4 minuti son tanti, ma facendo una full
outer join concatenando campi non indicizzati ciao.....
    danilo

 WHERE <campo_filtro> = Condizione
Qualcosa è migliorato, ma circa 1 secondo su 13.
In ogni caso abbiamo deciso di scorpare il codice di TabPrinc nei due altri.
Grazie :D

 altri.
Non dovrebbe cambiare gran che.
Prova con un indice...


Alberto
una cosa di questo genere potrebbe andare?
SELECT Testata.Codice, Testata.Descrizione, Dettaglio.descrizione
FROM Testata, Dettaglio WHERE Dettaglio.Codice =
left(testata.codice,6) and dettaglio.codice2 = right(testata.codice,3)
=======================================================================
Se mi vuoi scrivere togli le maiuscole
Sveltolampo 
cteniza...@hotmail.com
=======================================================================

 Prova con un indice...
Anche prima erano indicizzati i due campi, ora con l'indice solo sul
CodA (che poi sarebbe anche univoco), esegue la query istantaneamente.
Certo devo finire di modificare il programma per usare CodA e CodB
invece del campo "somma", ma in un'altro paio di orette dovrei fare.
-- 
Freccia@Buldozzer63 :D

 left(testata.codice,6) and dettaglio.codice2 = right(testata.codice,3)
Lunedì proverò, ma mi pare che Interbase non digerisca quelle istruzioni
:\
Ciao :)
-- 
Freccia@Buldozzer63 :D

 left(testata.codice,6) and dettaglio.codice2 = right(testata.codice,3)
Non so in Interbase, ma in Access ho scoperto che un
Campo = Left(Campo2, n)
è molto più lento di
Campo2 Like Campo + '%'
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net