Non ho mai imparato come funzionano i join ma solo usando select e la clausola where è stata sufficiente per tutte le query che ho fatto. Ci sono casi in cui non riesco a ottenere i risultati corretti usando la clausola WHERE e devo usare un JOIN? Se sì, qualcuno potrebbe fornirci degli esempi? Grazie.Le query che i join SQL impliciti non possono eseguire?
risposta
Sì. Quando si fanno join esterni. Puoi leggere this simple article sui join. Le unioni non sono difficili da capire, quindi dovresti iniziare subito a imparare (e usarle dove opportuno).
Non sono sicuro del motivo per cui è stato negativo. La risposta è morta ....... i join impliciti sono "interni" per impostazione predefinita. Quindi, il richiedente probabilmente ha bisogno di capire i diversi tipi di join. – tyshock
Oggi sembra essere un giorno negativo. Ho visto diverse domande e risposte ridotte oggi con altre persone che pubblicano commenti "perché è stato modificato". – jeffa00
Ogni volta che si desidera combinare i risultati di due tabelle è necessario unirsi a loro. Prendiamo ad esempio:
tabella Utenti:
ID
FirstName
LastName
UserName
Password
e indirizzi tavolo:
ID
UserID
AddressType (residential, business, shipping, billing, etc)
Line1
Line2
City
State
Zip
in cui un singolo utente potrebbe avere la sua casa e il suo indirizzo commerciale elencato (o di una spedizione e un indirizzo di fatturazione), o nessun indirizzo. L'utilizzo di una semplice clausola WHERE
non recupera un utente senza indirizzi perché gli indirizzi si trovano in una tabella diversa. Al fine di recuperare gli indirizzi di un utente ora, avrete bisogno di fare una join as:
SELECT *
FROM Users
LEFT OUTER JOIN Addresses
ON Users.ID = Addresses.UserID
WHERE Users.UserName = "foo"
Vedi http://www.w3schools.com/Sql/sql_join.asp per un po 'di più nella definizione di profondità del diverso raggiunge e come funzionano.
Non è necessario utilizzare 'inner join '. Puoi scriverlo come 'seleziona utenti. * Da utenti, indirizzi dove users.id = indirizzi.userid e users.username = "pippo" '. Ma questo non è il caso per i join esterni, come indicato nella mia risposta qui sotto. –
@klausbyskov: Quel *** è un join interno, è solo sintassi ANSI-89. –
Il mio male, è caduto nell'esempio sbagliato ... corretto ora: D –
Sintassi di join implicita per impostazione predefinita Inner joins. A volte è possibile modificare la sintassi di join implicita per specificare join esterni, ma è dipendente dal venditore nella mia esperienza (so che oracle ha la notazione (-) e (+), e credo che sqlserver usi * =). Quindi, credo che la tua domanda possa essere ridotta a comprendere le differenze tra join interni ed esterni.
Possiamo guardare un semplice esempio per un interno vs outer join utilizzando una query semplice ..........
L'implicita INNER JOIN:
select a.*, b.*
from table a, table b
where a.id = b.id;
È possibile che questo interrogazione restituirà SOLO le righe in cui la riga 'a' ha una riga corrispondente in 'b' per il suo campo 'id'.
L'ESTERNO esplicita JOIN:
select * from
table a LEFT OUTER JOIN table b
on a.id = b.id;
La query sopra riporterà ogni riga in una, anche se non ha una riga corrispondente in 'b'. Se non esiste alcuna corrispondenza per "b", i campi "b" saranno nulli.
In questo caso, se si desidera richiamare OGNI riga in 'a' indipendentemente dal fatto che avesse una riga 'b' corrispondente, sarà necessario utilizzare il join esterno.
Come ho detto, a seconda del fornitore del database, è ancora possibile utilizzare la sintassi implicita del join e specificare un tipo di join esterno. Tuttavia, questo ti lega a quel venditore. Inoltre, tutti gli sviluppatori che non hanno familiarità con la sintassi specializzata potrebbero avere difficoltà a comprendere la tua query.
Esistono casi in cui non è possibile ottenere i risultati corretti utilizzando la clausola WHERE e devo utilizzare un JOIN?
Ogni volta che la query riguarda due o più tabelle, viene utilizzato un join. This link è ottimo per mostrare le differenze nei join con le immagini e con i set di risultati del campione.
Se i criteri di join sono nella clausola WHERE
, viene utilizzata la sintassi JOIN ANSI-89. La ragione della più recente sintassi JOIN nel formato ANSI-92 è che ha reso LEFT JOIN più coerente tra i vari database. Ad esempio, Oracle utilizzava (+)
sul lato che era facoltativo mentre in SQL Server si doveva usare =*
.
E la sintassi di join implicita in SQl Server non è più valida e, anche nelle versioni precedenti, forniva risultati errati poiché a volte veniva interpretata come join esterno e talvolta come cross join. – HLGEM
utilizzando join:
SELECT a.MainID, b.SubValue AS SubValue1, b.SubDesc AS SubDesc1, c.SubValue AS SubValue2, c.SubDesc AS SubDesc2
FROM MainTable AS a
LEFT JOIN SubValues AS b ON a.MainID = b.MainID AND b.SubTypeID = 1
LEFT JOIN SubValues AS c ON a.MainID = c.MainID AND b.SubTypeID = 2
fuori mano, non riesco a vedere un modo di ottenere gli stessi risultati che, utilizzando una semplice clausola WHERE per unire le tabelle. Inoltre, la sintassi comunemente usata nelle clausole WHERE per creare join sinistro e destro (* = e = *) è in fase di eliminazione,
(* = e = *) non solo viene eliminato gradualmente in SQL Server, ma al momento non restituisce sempre risultati corretti. – HLGEM
I join impliciti sono più di 20 anni non aggiornati. Perché dovresti prendere in considerazione la possibilità di scrivere codice con loro?
Sì, possono creare problemi che i join espliciti non hanno. Parlando di SQL Server, non è garantito che le sintassi implicite di join sinistro e destro restituiscano i risultati corretti. A volte, restituiscono un join incrociato anziché un join esterno. Questa è una brutta cosa Questo era vero almeno fino a SQL Server 2000, e sono stati eliminati gradualmente, quindi usarli è una pratica tutt'altro che semplice.
L'altro problema con join impliciti è che è facile eseguire accidentalmente un cross join dimenticando una delle condizioni in cui si trova, in particolare quando si uniscono troppe tabelle. Utilizzando i join espliciti, si verificherà un errore di sintassi se si dimentica di inserire una condizione di join e un cross join deve essere esplicitamente specificato come tale. Di nuovo, questo si traduce in query che restituiscono valori errati o che vengono risolti utilizzando distinti per sbarazzarsi del cross join che è inefficiente nella migliore delle ipotesi.
Inoltre, se si dispone di un cross join, lo sviluppatore di manutenzione che arriva in un anno per apportare una modifica non sa se è stato progettato o meno quando si utilizzano join impliciti.
Credo che alcuni ORM ora richiedano anche join espliciti.
Inoltre, se si utilizzano i join impliciti perché non si capisce come funzionano i join, è probabile che si stia scrivendo codice che, di fatto, non restituisce il risultato corretto perché non si sa come valutare quale sarebbe il risultato corretto dal momento che non capisci cosa si intende fare un join.
Se si scrive codice SQL di qualsiasi gusto, non ci sono scuse per non comprendere a fondo i join.
FYI, 17 anni = superato dallo standard ANSI 92 SQL (e 18 anni domani :-) – gbn
- 1. SQL Elaborate Join Query
- 2. con inner join query SQL
- 3. SQL Query JOIN con tabella
- 4. Le query compilate e "I parametri non possono essere sequenze"
- 5. Quando i query LINQ to SQL eseguire?
- 6. Le query del server SQL possono essere realmente annullate/eliminate?
- 7. Query SQL per "concatenare in join"
- 8. Più SQL join
- 9. Query SQL con join, conteggio e dove
- 10. query SQL eseguire con PreparedStatement
- 11. Query SQL per Join interno con Select
- 12. Come eseguire questa query sql?
- 13. SQL, aggiungere le query
- 14. Le interfacce non possono dichiarare i tipi
- 15. Tabelle join query HQL
- 16. SQL Spatial Join
- 17. Che meccanismo incorporato fa SQL Server per eseguire query Flashback?
- 18. SQL Server NOLOCK e join
- 19. Query che utilizzano i caratteri jolly LIKE nel server sql
- 20. JOIN query vs più query
- 21. Come eseguire query SQL non elaborate con Sequel
- 22. Esiste una raccomandazione ufficiale Oracle sull'uso di JOIN ANSI espliciti rispetto ai join impliciti?
- 23. Query SQL con SOMMA su colonna in tabella JOIN
- 24. Le istanze EC2 non possono eseguire il ping l'un l'altra
- 25. SQL Partecipa e mostra i risultati se join false
- 26. Ridurre al minimo le query SQL utilizzando join con la relazione uno-a-molti
- 27. non possono ottenere Multiprocessing per eseguire i processi in concomitanza
- 28. MYSQL - Elimina query con Join
- 29. SQL Registrazione vs query separata in codice senza Join - Prestazioni
- 30. Le query multilinea sql-injection sono sicure?
La risposta più semplice è: dovresti conoscere i JOIN. In molti casi, ti semplificheranno la vita, anche se c'è un altro modo per scrivere la tua domanda. –
Ora una cosa molto buona per te sarebbe quella di imparare ad accettare le risposte date alle tue domande che sembrano corrette. Sento che le risposte non sono necessarie, o commentare le risposte date o piazzare una taglia. MK? –