Newsgroup: it.comp.lang.visual-basic
Titolo: [?] SQL, Count e Subquery

Ho la necessità di selezionare campi all'interno di una tabella e anche un
indicatore che mi dica se vi sono righe (non mi importa quante) che
soddisfano certe condizioni, all'interno della stessa tabella, per ciascun
record.
Per ottenere quest'ultima cosa (con una Subquery), ho notato che le varie
condizioni Where non vanno se non specifico una "nuova" tabella (MOV_XXX),
mettendo come AS quella di effettiva consultazione (MOV).
Accade che (sempre all'interno della Subquery) mi segnala un errore
(Parametri insufficienti, previsti 4) perchè non riconosce i vari campi
MOV.eccetera che uso per comporre la LIKE, con l'intento di prenderne i
valori correnti dal record "principale" (MOV).
Se tolgo la riga "SELECT COUNT(*) FROM (" e la parentesi chiusa relativa in
coda, tutto va (non vengono segnalati errori), anche se, ovviamente, non me
ne faccio nulla.
Non riesco a capire. Grazie per ogni indicazione.
Questa è la query:
SELECT
 MOV.TIPO_DOC,
 MOV.EMESSO_DOC,
 MOV.MAGAZZINO_ORIGINE_DOC,
 MOV.SIGLA_DOC,
 MOV.NUMERO_DOC,
 MOV.RIGA,
(
   SELECT COUNT(*) FROM (
       SELECT TOP 1 MOV_XXX.NUMERO_DOC
       FROM
          MOV AS MOV_XXX
       WHERE
          MOV_XXX.MOV_PAR_VARI
          LIKE '*¿ORCO=R'
          & MOV.MAGAZZINO_ORIGINE_DOC
          & Space (2-Len(MOV.MAGAZZINO_ORIGINE_DOC))
          & Space (1)
          & MOV.SIGLA_DOC
          & Space (1-Len(MOV.SIGLA_DOC))
          & MOV.NUMERO_DOC
          & Right(10^6+MOV.RIGA,6) & '¿*'
   )
)
AS HA_RIGHE
FROM MOV

 Non riesco a capire. Grazie per ogni indicazione.
 Spero di essere stato chiaro
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

   Ovvio
Ma ti riferisci ai livelli di parentesi? Le stesse sono state messe per
questioni sintattiche, non, credo, logiche.
Perchè, ripeto, se tolgo il Select Count(*), non mi segnala l'errore di
prima, ovvero vede tranquillamente i dati da MOV? Oppure è questo che
introduce un secondo livello?


  Ti faccio un esempio simile alla tua query:
  SELECT *,
         ( SELECT COUNT(*) FROM -----> 1° Livello
                  ( SELECT * FROM TAB2 -----> 2° Livello di nidificazione
                    WHERE ----> Qui TAB1 non viene vista
                   )
           WHERE --------> Qui TAB1 viene vista
         )
  FROM TAB1
  Spero di essermi spiegato meglio.


   Spero di essermi spiegato meglio.
Sì, purtroppo.
Cambierò la logica...


 In ogni caos tornando alla tua subquery :
 
  SELECT COUNT(*) FROM (
       SELECT TOP 1 MOV_XXX.NUMERO_DOC
       FROM
          MOV AS MOV_XXX
       WHERE
          MOV_XXX.MOV_PAR_VARI
          LIKE '*¿ORCO=R'
          & MOV.MAGAZZINO_ORIGINE_DOC
          & Space (2-Len(MOV.MAGAZZINO_ORIGINE_DOC))
          & Space (1)
          & MOV.SIGLA_DOC
          & Space (1-Len(MOV.SIGLA_DOC))
          & MOV.NUMERO_DOC
          & Right(10^6+MOV.RIGA,6) & '¿*'
   )
   anche se fosse possibile, ti restituirebbe sempre 1 o 0 giusto?
Allora puoi togliere la count() e verificare che il campo
"MOV_XXX.NUMERO_DOC" sia o meno null.
In pratica se MOV_XXX.NUMERO_DOC <> NULL allora ha trovato 1 riga ( l'unica
che tu selezioni con TOP 1 ) se = NULL significa che non ha trovato nulla
quindi 0 righe.
Potrebbe essermi sfuggito qualcosa vista l'ora...


 "MOV_XXX.NUMERO_DOC" sia o meno null.
Buona idea. Certamente sufficiente allo scopo.
Proverň. Grazie.

 Proverň. Grazie.
  Di nulla.
Anzi al limite se proprio ti servisse il numero di record questa subquery (
in pratica una specie di self-join ) potrebbe fare al caso tuo:
 ( SELECT COUNT(*) FROM
          MOV AS MOV_XXX
       WHERE
          MOV_XXX.MOV_PAR_VARI
          LIKE '*żORCO=R'
          & MOV.MAGAZZINO_ORIGINE_DOC
          & Space (2-Len(MOV.MAGAZZINO_ORIGINE_DOC))
          & Space (1)
          & MOV.SIGLA_DOC
          & Space (1-Len(MOV.SIGLA_DOC))
          & MOV.NUMERO_DOC
          & Right(10^6+MOV.RIGA,6) & 'ż*'
 )
 
 
 Essendo la "where" al primo livello la tabella MOV piů esterna viene
"vista".
