Creare tabelle da query

di il
9 risposte

Creare tabelle da query

Buongiorno a tutti, è la prima volta che scrivo in questo forum e vi pongo il presente quesito :
ho una tabella con diversi campi che "vengono" da una query di creazione tabella. di volta in volta voglio che in questa tabella siano presenti solo le colonne che nella query abbiano come condizione diverso da "zero" o "non vuote" ho provato con sql la seguente istruzione :
"ALTER TABLE [Cruscotto-269] DROP COLUMN 10" ;
che, inserita in una query Access, mi elimina, dalla tabella Cruscotto-269, il campo 10 ma a prescindere se esso è vuoto o meno .
Premetto che i campi su cui debbono valere le condizioni di vuoto/non vuoto sono molteplici (circa 40) come posso fare?
Questo perché trasferisco la tabella in un foglio Excel dove mi occorrono solo i campi non vuoti che tra l'altro mi restituisce "troppi campi definiti..." ma questa è un'altra storia...Grazie per le dritte che mi verranno da tutti voi.

9 Risposte

  • Re: Creare tabelle da query

    Purtroppo non posso aiutarti sul SQL che non so gestire. Ma, in visualizzazione struttura query, in corrispondenza del rigo Criteri, alla colonna 10, prova a scrivere così:
    <>""
    che vuol dire Diverso (<>) dal valore racchiuso tra le virgolette (ossia Null).
  • Re: Creare tabelle da query

    Devo fare una precisazione tecnica rilevante...
    Definire "" equivalente a NULL è estremamente errato.

    Il primo è un valore Stringa con Lunghezza=0
    Il Secondo non è un valore Stringa, è assenza di dato.

    Non sottovalutate questi aspetti... una Variabile definita Stringa non può assumere valore NULL, ne consegue che non possono essere associabili...

    Se riempite un campo con NULL non verranno identificati Records cercando "" e viceversa...

    In merito alla cancellazione di CAMPI sono molto stranito dall'esigenza di Creare e Cancellare campi in Tabella come fosse un foglio di Excel... motivo per il quale evito di esporre la mia ipotesi...

    In tutti i casi non si può ottenere la cancellazione di una Colonna condizionando lo Statement DDL di DROP, serve fare 2 passaggi...
    1° Query di verifica che nessun Records venga restituito applicando al Campo il Criterio NULL
    2° Se nessun Record è presente(significa che tutti sono NULL in quel campo) allora lo statement DDL(Data Definition Language) consentirà il DROP.

    Ricordo che esiste anche il metodo DELETE di DAO applicabile sulla Collection FIELDS membro dell'oggetto TABLEDEF

    Quindi
    
    DbExecute(0)(0).Tabledefs("NomeTabella").Fields.Delete NomeCampo
    Saluti...
  • Re: Creare tabelle da query

    OsvaldoLaviosa ha scritto:


    <>""
    che vuol dire Diverso (<>) dal valore racchiuso tra le virgolette (ossia Null).
    Falso teorico

    @Alex ha scritto:


    Definire "" equivalente a NULL è estremamente errato.
    Il primo è un valore Stringa con Lunghezza=0
    Il Secondo non è un valore Stringa, è assenza di dato.
    Corretto teoricamente

    La precisazione di Alex non fa una grinza. Di fatto poi, applicando la sintassi:
    <>""
    credo che Mykia risolva nella sostanza il suo problema.
    Con quella sintassi eviti di visualizzare sia i Null, sia le Stringhe-lunghezza-zero.
  • Re: Creare tabelle da query

    No... forse non mi sono spiegato...!

    Se scrivi [<>""] l'unico valore che scarti è Stringhe-lunghezza-zero, ma il NULL lo conservi...!

    Per Scartare Null ed anche Stringhe-lunghezza-zero l'unica sintassi è questa
    
    Len([Campo] + "")>0
    Questo perchè se il campo Fosse NULL il fatto di Sommare una stringa a lunghezza zero, obbliga il CASTING del DataType da VARIANT(Null) a String(NullString).

    Per fare una prova devi provare a riempire da CODICE una tabella con qualche Valore NULL e qualche Stringhe-lunghezza-zero... e poi gioca con i FILTRI... o WHERE CONDITION per capire.

    In tutti i casi la sintassi DDL di DROP non funziona.
  • Re: Creare tabelle da query

    @Alex ha scritto:


    Se scrivi [<>""] l'unico valore che scarti è Stringhe-lunghezza-zero, ma il NULL lo conservi...!

    @Alex ha scritto:


    Per fare una prova devi provare a riempire da CODICE una tabella con qualche Valore NULL e qualche Stringhe-lunghezza-zero... e poi gioca con i FILTRI... o WHERE CONDITION per capire.
    Non sono d'accordo, proprio perchè ho fatto varie prove e quella sintassi mi restituisce esattamente il risultato che cerchiamo.
  • Re: Creare tabelle da query

    Non sono d'accordo, proprio perchè ho fatto varie prove e quella sintassi mi restituisce esattamente il risultato che cerchiamo.
    riassumo qui la mia richiesta di aiuto....
    Nella Tabella che viene creata non devono comparire i campi che nella query sono o nulli o uguale a zero il metodo elencato filtra solo i record (righe) ma i campi (Colonne) restano.
    Pensavo che il comando drop column poteva essere assoggettato ad una condizione di tipo where
    dovrò rassegnarmi a scrivere un pò di codice o al limite aggirerò l'ostacolo nascondendo nella tabella risultante dalla query di cui sopra quelle colonne che soddisfano la condizione di essere vuote o uguali a zero (questo credo che si possa fare).
  • Re: Creare tabelle da query

    OsvaldoLaviosa ha scritto:


    Non sono d'accordo, proprio perchè ho fatto varie prove e quella sintassi mi restituisce esattamente il risultato che cerchiamo.
    Puoi non essere d'accordo ma è così, sono certo che sbagli qualche cosa, ma non voglio insistere su concetti tecnici...

    Fai ad esempio un test Opposto invece di usare [<>""] prova con [=""] su campi non valorizzati...
    In tutti i casi è questione di non capire la differenza tra NULL e NULLSTRING, cosa che puoi facilmente vedere nella Finestra immediata...

    Crea una tabella con 1 Campo ID(Counter) e 2 campi testo... [CampoTest] e [Campo1]
    Ora inserisci 2 Records, inserendo un dato solo nel Campo1, lasciando il [CampoTest] vuoto...!

    Ora fai una SELECT così
    
    SELECT * FROM Tabella
    WHERE [CampoTest]=""
    Se ti restituisce ZERO RECORDS credo tu possa convincerti che sbagli...
    Se invece fai così
    
    SELECT * FROM Tabella
    WHERE [CampoTest] Is Null
    Otterrai 2 Records...
  • Re: Creare tabelle da query

    Conosco la differenza fra Null e Stringa di lunghezza zero.
    So soltanto che una volta, per caso ho applicato la sintassi <>"" e mi ha dato i risultati che volevo (come immagino desidera pure Mykia), proprio perchè non ricordavo più dove c'erano Null e dove Stringhe di lunghezza zero. Assolta quella funzione "pratica" a quel solo fine, mi sono messo l'anima in pace che poteva passare pure così.
    Semmai, applicarla sempre, magari all'interno di espressioni più elaborate (VBA o SQL che siano), potrebbe generare errori o effetti indesiderati che Access non sarebbe in grado di riconoscere.

    Questo link
    http://office.microsoft.com/it-it/access-help/esempi-di-criteri-di-query-HA010066611.aspx
    dovrebbe far tacere tutti.
    Allora ripropongo una sintassi più ortodossa, presa proprio da quel link:
    Is Not Null And Not ""
    Credo che Mykia avrebbe chiesto di sapere come nascondere la colonna a certe condizioni, io non so come si fa e mi fermo qui.
  • Re: Creare tabelle da query

    Voglio mettere i punti sulle [I]... anche se hai capito quello che volevo dire, perchèp quell'articolo conferma quanto dicevo....!

    La sintassi che hai proposto con i 2 Criteri in AND che ovviamente è corretta, ma viene ottimizzata con quello che io ho detto all'inizio
    
    Len([Campo] + "")>0
    Questa sintassi si basa sulla conoscenza di come avviene il CASTING dei dati, ovvero il forzamento che il sistema effettua quando si trova ad elaborare 2 DataType differenti.

    E' vero infatti che attuando i piani di esecuzione delle QUERY si evincerebbe un minor impegno del motore di calcolo della query, ricordo che 2 CRITERI è più di UNO... e per chi sa cosa sono i piani di esecuzione la considerazione è scontata...!

    Ciudo che l'essere o meno in accordo di norma ha un senso se, viene tecnicamente argomentato in modo da non lasciare il DUBBIO TECNICO.

    A chiusura ora cerca di capire il perchè della differenza di comportamento tra [<>""] e [=""] e forse fai un'altro passaggio tecnico nella mia direzione.(ovviamente non mi riferisco al DIVERSO e UGUALE ma al modo nel quale questi 2 predicati danno risultati non apparentemente coerenti)

    Saluti.
Devi accedere o registrarti per scrivere nel forum
9 risposte