PDA

View Full Version : Query SQL ... mi aiutate ???


leon84
04-07-2005, 13:27
Ho una tabella che contiene i seguenti campi :
(vi elenco i più significativi)

nome_Stazione (codice alfanumerico di 4 caratteri)
anno
giuliano
...
...
...
...
...

nome_Stazione,anno,giuliano insieme sono chiave primaria per la tabella

Quello che devo fare è verificare se esiste l'informazione per un dato giuliano di un certo anno ma se l'informazione non esiste devo anche sapere per quale stazione non esiste ....

Avevo quindi pensato a una left join tra un
SELECT DISTINCT (nome_Stazione) FROM Tabella
e

SELECT nome_Stazione, anno , giuliano WHERE anno = 'anno' AND giuliano = 'giuliano'

in questo modo se esistono delle informazioni per una determinata stazione ma non sono presenti ne giuliano ne anno per quella stazione cmq mi visualizzerà il nome stazione senza anno e giuliano ... dico bene ????

In sintassi SQL ???

maulattu
04-07-2005, 14:14
SELECT DISTINCT (nome_Stazione) FROM Tabella

union

SELECT nome_Stazione, anno , giuliano from (nome_Stazione) WHERE anno = 'anno' AND giuliano = 'giuliano'

Attenzione che "union" automaticamente non considera gli elementi duplicati. Se ti interessa tener conto di elementi duplicati usa "union all".
La parte in grassetto te l'eri dimenticata... :D

leon84
04-07-2005, 14:14
Questa non mi funge :


SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano
FROM log AS A
LEFT OUTER JOIN
SELECT B.anno, B.giuliano FROM log as B WHERE anno='05' AND giuliano = '035'
ON A.nome_stazione = B.nome_stazione

leon84
04-07-2005, 14:17
SELECT DISTINCT (nome_Stazione) FROM Tabella

union

SELECT nome_Stazione, anno , giuliano from (nome_Stazione) WHERE anno = 'anno' AND giuliano = 'giuliano'

Attenzione che "union" automaticamente non considera gli elementi duplicati. Se ti interessa tener conto di elementi duplicati usa "union all".
La parte in grassetto te l'eri dimenticata... :D

Quindi la query completa e corretta come diviene ?

glb
04-07-2005, 15:05
Questa non mi funge :


SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano
FROM log AS A
LEFT OUTER JOIN
SELECT B.anno, B.giuliano FROM log as B WHERE anno='05' AND giuliano = '035'
ON A.nome_stazione = B.nome_stazione

Ciao

Ad occhio non funge xchè nella tabella definita dalla seconda select devi indicare (nella select appunto) il campo nome_stazione che serve x la join.

Cioe: SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano
FROM log AS A
LEFT OUTER JOIN
SELECT B.nome_stazione , B.anno, B.giuliano FROM log as B WHERE anno='05' AND giuliano = '035'
ON A.nome_stazione = B.nome_stazione

Per quanto riguarda la query proposta da maulattu a parte il fatto che non capisco cosa c'entri con il tuo problema sempre ad occhio :mbe: :) non mi sembra possa funzionare xchè in una union le query/tabelle che si vogliono unire devono avere la stessa struttura cioè gli stessi campi (almeno credo).

Se ho capito bene ed il problema è quello di individuare i record nei quali i campi chiave siano vuoti dovresti semplicemente fare una select tipo:

Select nome_stazione, anno, giuliano
FROM log
where

(nome_stazione is null) OR (anno is null) OR (giuliano is Null)


Bye

kk3z
04-07-2005, 15:50
:mbe:

1) non puoi fare due select in una query :eek:
2) non serve SELECTare i campi per le clausole WHERE e ON
3) stai facendo un join suoi campi di una stessa tabella :eek: :mbe:


se proprio vuoi quella query:
SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano
FROM log A
LEFT OUTER JOIN log B
ON (B.anno='05'
AND B.giuliano = '035'
AND A.nome_stazione = B.nome_stazione)

beppegrillo
04-07-2005, 16:08
:mbe:

1) non puoi fare due select in una query :eek:

Uhm?
Mai sentito parlare di subselect o query innestate?

maulattu
04-07-2005, 16:20
Quindi la query completa e corretta come diviene ?

così:

SELECT DISTINCT (nome_Stazione) FROM Tabella
union
SELECT nome_Stazione, anno , giuliano from Tabella WHERE anno = 'anno' AND giuliano = 'giuliano'

beppegrillo
04-07-2005, 17:22
così:

SELECT DISTINCT (nome_Stazione) FROM Tabella
union
SELECT nome_Stazione, anno , giuliano from Tabella WHERE anno = 'anno' AND giuliano = 'giuliano'
L'union la puoi applicare solo su insiemi uguali..

Brazorv
04-07-2005, 17:29
EDIT non avevo capito quello che chiedevi

glb
05-07-2005, 07:29
così:

SELECT DISTINCT (nome_Stazione) FROM Tabella
union
SELECT nome_Stazione, anno , giuliano from Tabella WHERE anno = 'anno' AND giuliano = 'giuliano'


Ciao

Mi spieghi xchè metti nome_stazione tra parentesi? che ci azzecca? :rolleyes:
Comunque la tua query è sempre sbagliata . :mc: :muro:
Le tabelle unite DEVONO avere la stessa struttura.

:mbe:

1) non puoi fare due select in una query :eek:
2) non serve SELECTare i campi per le clausole WHERE e ON
3) stai facendo un join suoi campi di una stessa tabella :eek: :mbe:


se proprio vuoi quella query:
SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano
FROM log A
LEFT OUTER JOIN log B
ON (B.anno='05'
AND B.giuliano = '035'
AND A.nome_stazione = B.nome_stazione)

1) come diceva giustamente beppe le subselect (o sottoquery) sono assolutamente ammissibili in sql anche se, in alcuni casi, (es. access) è necessario metterle tra parentesi.
2) Non puoi mettere nelle condizioni di join dei valori ma solo nomi di campo :mbe: . Dove l'hai vista una cosa del genere? :muro: :mbe:
3) Hai mai sentito parlare di selfjoin :rolleyes:

Ditemi una cosa. I vostri suggerimenti sono basati su una esperienza specifica o ....... tirate ad indovinare. :D

Bye

Brazorv
05-07-2005, 08:34
Ditemi una cosa. I vostri suggerimenti sono basati su una esperienza specifica o ....... tirate ad indovinare.
ma hai provato ad eseguire la tua query? è sbagliata sintatticamente, kk3 ha corretto i tuoi errori e la sua funziona bene. Quando usi i join non devi fare una select nella seconda tabella. Devi specificare la seconda tabella + la condizione di join + la clausola WHERE se lo vuoi.
ne tuo primo post hai pure scritto questo
Select nome_stazione, anno, giuliano
FROM log
where

(nome_stazione is null) OR (anno is null) OR (giuliano is Null)

ma se nome_stazione, anno, giuliano sono la chiave primaria come possono essere null?

glb
05-07-2005, 09:42
ma hai provato ad eseguire la tua query? è sbagliata sintatticamente, kk3 ha corretto i tuoi errori e la sua funziona bene. Quando usi i join non devi fare una select nella seconda tabella. Devi specificare la seconda tabella + la condizione di join + la clausola WHERE se lo vuoi.
ne tuo primo post hai pure scritto questo

ma se nome_stazione, anno, giuliano sono la chiave primaria come possono essere null?

Allora.... :) Ricapitoliamo.

Io ho suggerito 2 query:

La prima (che come avevo sottolineato era fatta ad occhio :cool: ) serviva solo x spiegare l'errore di non aver aggiunto nella select della sottoquery da Joinare con un selfjoin ;) alla tabella il nome del campo utilizzato come chiave di join. In effetti non l'avevo provata (era solo un esempio) c'era qualche errore di sintassi. La query corretta e funzionante (provata in access 2002) sarebbe:

SELECT DISTINCT A.nome_stazione, B.anno, B.giuliano FROM log AS A LEFT OUTER JOIN (SELECT nome_stazione , anno, giuliano FROM log WHERE anno='05' AND giuliano = '035') as B ON A.nome_stazione = B.nome_stazione

La seconda invece funziona correttamente.

Per quanto riguarda, però, la tua osservazione sul fatto che la chiave primaria x definizione non può contenere valori null hai perfettemente ragione sempre che i campi in questione SIANO definiti chiave primaria nella struttura della tabella.
Se fosse così la stessa domanda di leon sarebbe improponibile. Se il problema invece esiste possono esserci 2 possibilità:

La prima è che quei campi vengano di fatto utilizzati come chiavi primarie senza essere definiti nella struttura della tabella come tali.
La seconda è che invece i campi contengano stringhe nulle ("") . In questo caso nella query che ho proposto basta cambiare 'is null' con '=""'.

Scusa se ti ho dato prima l'impressione di essere un saputello :O non ne avevo l'intenzione ma sinceramente continuo a non capire perchè continui a sostenere che la query proposta da kk3z sia corretta ed abbia corretto i miei errori.

Per curiosità ho provato as eseguirla in access nel db di esempio che mi sono costruito x verificare le query che avevo suggerito e il risultato è stato prima un msg di errore poi addirittura la chiusura del programma :doh: . Evidentemente access non l'ha gradita :D .

Bye

Brazorv
05-07-2005, 09:57
la tua ultima query è corretta (nella prima mancavano le parentesi), ed è perfettamente equivalente a quella di kk3z. io le ho provate su postgres.

glb
05-07-2005, 10:39
la tua ultima query è corretta (nella prima mancavano le parentesi), ed è perfettamente equivalente a quella di kk3z. io le ho provate su postgres.

Beh! Se è così significa che la possibilità di mettere valori puntuali piuttosto che nomi di campo nelle chiavi di join c'è ma dipende dal 'dialetto 'sql' utilizzato. (con jet sql di access non sembra possibile :muro: )

In effetti è una grande comodità. ;) . Sarei curioso di sapere se è previsto nel sql standard.

C'è sempre qualcosa da imparare. :D

Ciao e grazie