Domanda

Ho tre tabelle (semplificate qui):

recipients: recipientId, isGroup
users: userId, first name, last name
groups: groupid, groupname

Voglio ritirare il nome / cognome se il destinatario è un utente e il nome del gruppo se il destinatario è un gruppo. È possibile che il destinatario non sia nessuno dei due (cioè un gruppo che è stato cancellato/non più esiste), quindi in quel caso non voglio restituire nulla.

Quindi questo è quello che ho fatto:

select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL

La query di cui sopra non sta restituendo i risultati previsti. Lo sto riprendendo:

adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1
null, null, null, 1

L'ultima riga è inaspettata, poiché chiaramente non esiste un nome di gruppo (G.GroupName è nullo) e r.isGroup = 1.

Quando lo faccio:

select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL

Ottengo i risultati previsti:

adam, smith, null, null
yolanda, smith, null, null

E quando lo faccio:

select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where g.groupname IS NOT NULL

Ottengo i risultati previsti:

null, null, members, 1

È solo quando combino i due in cui le clausole con un o, ottengo la riga aggiuntiva.

Ora, quando cambio la mia domanda in (cambio da null a isnull):

select u.first_name, u.last_name, g.groupname, r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or ISNULL(g.groupname, null) IS NOT NULL

Ottengo i risultati previsti:

adam, smith, null, null
yolanda, smith, null, null
null, null, members, 1

In effetti, non devo nemmeno cambiare la clausola Where, anche la seguente query funziona altrettanto bene e mi dà il risultato atteso mostrato sopra:

select u.first_name, u.last_name, ISNULL(g.groupname,null), r.isGroup
from recipients r
left join users u on u.userid = r.recipientId
left join groups g on g.groupid = r.recipientId
where r.isGroup IS NULL or g.groupname IS NOT NULL

Quindi, la domanda è: perché? Perché mettere ISNULL nella mia istruzione selezionata cambia come funziona la clausola Where? Perché fa la differenza? Perché la mia prima query non funziona? Perché non riesce a funzionare solo quando aggiungo o - perché non è rotto senza di essa?

Grazie in anticipo.

Sto usando MS SQL Server 2008.

Modifiche: errori di battitura fissi, domanda chiarificata

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top