Newsgroup: it.comp.appl.access
Titolo: GROSSO problema SQL con query in Access

Salve a tutti.
C'è un problema logico in una query che sto realizzando per un sito in ASP 
classic che non riesco a risolvere. Ecco i dati della questione.
Ho tre tabelle:
-  Articoli  [ID_articolo,Marca,Modello]
ID_articolo    Marca                Modello
900               |ABCD               |BEL MODELLO
156               |AMADI             |MIOMODELLO
800               |AMADI             |SECONDO MODELLO
-  Campi [ID_campo,Campo]
ID_campo     Campo
28                 |Anno
29                 |Spessore
30                 |Ferro
31                 |Inox
32                 |Alluminio
-  Valori [ID_valore, ID_campo, ID_articolo, Valore]
ID_valore    ID_campo      ID_articolo      Valore
217             |28                 |156                 |2006
218             |29                 |156                 |15
219             |30                 |156                 |pippo
220             |31                 |156                 |
221             |32                 |156                 |paperino
222             |33                 |900                 |
223             |34                 |800                 |classe 2
224             |35                 |800                 |paperino
225             |36                 |156                 |
226             |37                 |156                 |
227             |39                 |156                 |A 30 giorni
Partendo da accoppiate (in numero di volta in volta VARIABILE) ID_campo, 
[Valore da cercare] ad esempio di questo tipo
ID_campo=28 Valore="2006"
ID_campo=30 Valore="pippo"
ID_campo=32 Valore="paperino"
(in questo caso ho preso 3 accoppiate ma potrebbero essere anche 5 o 13 
ecc...)
devo cercare sulla tabella Valori tutti gli ID_articolo che soddisfano 
contemporaneamente TUTTE le condizioni (in questo caso solo l'ID_articolo 
'156').
Di certo non posso cavarmela con una semplice concatenazione di AND su 
Valori del tipo
SELECT DISTINCT ID_articolo FROM Valori WHERE (ID_campo=28 AND 
Valore='2006') AND (ID_campo=30 AND Valore='pippo') ecc.
perchè non avrebbe senso. Ho anche pensato a diversi cicli che potrei fare 
in ASP per risolvere il problema ma l'unica strada che ho trovato è 
tremendamente complicata (pensavo di fare una query su ogni accoppiata su 
Valori che restiuisca un array di <ID_campo,ID_articolo> e poi confrontare 
tra loro gli N array per verificare in quali casi un ID_articolo compariva 
sempre...)
La questione di fondo è che ogni query sull'accoppiata ID_campo-Valore in 
Valori può generare non una ma una SERIE di ID_articolo...
Qualcuno di voi sa gentilmente suggerirmi una soluzione ? Il mio ambiente di 
lavoro è Access quindi non si possono fare costrutti molto avanzati.
Ogni aiuto sarebbe ESTREMAMENTE gradito.
Grazie a tutti,
Newcomsas

(...)
Vincenzo Turturro
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com/
---------------------------------------------
E quello di it.comp.as400
http://www.faq400.com/
---------------------------------------------

 Next i
In effetti questa è la prima strada che ho tentato; così facendo però non
viene MAI ritornato niente. Sarebbe come chiedere al motore SQL: "in quali
record ID_campo è uguale a 30 e uguale a 28 (ad esempio) ?" La risposta è
'mai'. Diverso invece se fra i blocchi ci fosse OR:
 $Where=Trim$($Where) & " OR (ID_Campo=" & accoppiate(i,1) & " AND Valore='"
& accoppiate(i,2) & "')"
allora funzionerebbe, ma a me serve proprio la condizione di
contemporaneità... quindi per forza AND.
Newcomsas



Daccordo: ho perso un'ottima occasione per tacere !
Del resto, mi pareva che mi fosse sfuggito qualcosa ...
Vediamo se riesco a recuperare:
$Where=""
For i = 1 To 100
  if accoppiate(i,1) >"" then
    $Where=Trim$($Where) & " OR (ID_Campo=" & accoppiate(i,1) & " AND
Valore='" & accoppiate(i,2) & "')"
 else
     exit for
 endif
Next i
if $Where>"" then $Where=mid$($Where,5)
$SQL = "SELECT Count(ID_Valore) AS NumValori, ID_Articolo
FROM Valori WHERE " & $Where & " GROUP BY ID_Articolo HAVING
Count(ID_Articolo)=" & i-1

Così è più compatta:
$SQL= "SELECT ID_Articolo
FROM Valori
WHERE " & $Where & " GROUP BY ID_Articolo HAVING Count(ID_Valore)=" &
i-1

 Qualcuno di voi sa gentilmente suggerirmi una soluzione ?
secondo me ti serve qualcosa del genere
SELECT DISTINCT ID_articolo FROM Valori WHERE
id_articolo in(select id_articolo from valori where ID_campo=28 AND
Valore='2006')
AND id_articolo in(select id_articolo from valori where ID_campo=30 AND
Valore='pippo')
continuando ad aggiungere condizioni fino a quando te ne servono...
fai delle prove per vedere la velocità di esecuzione perchè con le
subselect a volte l'esecuzione è lenta..
Saluti e buon lavoro
Gabry 69