2010-07-22 5 views
30

Conosco l'utilizzo di join, ma a volte mi imbatto in una situazione in cui non sono in grado di decidere quale unire sarà adatto, a a sinistra o destra.Come faccio a decidere quando usare giunzioni giuste/giunzioni a sinistra o giunti interni O come determinare quale tabella si trova su quale lato?

Questa è la query in cui sono bloccato.

SELECT count(ImageId) as [IndividualRemaining], 
       userMaster.empName AS ID#, 
       CONVERT(DATETIME, folderDetails.folderName, 101) AS FolderDate, 
       batchDetails.batchName AS Batch#, 
       [email protected], 
       TotalInloaded = IsNull(@TotalInloaded,0), 
       PendingUnassigned = @PendingUnassigned, 
       InloadedAssigned =  IsNull(@TotalAssigned,0), 
       TotalProcessed = @TotalProcessed, 
       Remaining = @Remaining 
     FROM 
       batchDetails 
        Left JOIN folderDetails ON batchDetails.folderId = folderDetails.folderId 
        Left JOIN imageDetails ON batchDetails.batchId = imageDetails.batchId 
        Left JOIN userMaster ON imageDetails.assignedToUser = userMaster.userId 

     WHERE folderDetails.ClientId [email protected] and verifyflag='n' 
       and folderDetails.FolderName IN (SELECT convert(VARCHAR,Value) FROM dbo.Split(@Output,',')) 
       and userMaster.empName <> 'unused' 

     GROUP BY userMaster.empName, folderDetails.folderName, batchDetails.batchName 

     Order BY folderDetails.Foldername asc 
+2

UN DIRITTO join è la stessa di un LEFT JOIN se non con l'ordine delle tabelle acceso. FROM TableA LEFT JOIN TableB == FROM TableB RIGHT JOIN TableA (anche se si utilizza SELECT *, l'ordine delle colonne sarà diverso poiché emette le colonne per ordine di tabella) – GalacticCowboy

+0

possibile duplicato di [Qual è la differenza tra (INNER JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN) in Mysql] (http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-full-join-in -mys) – JonH

+1

@JonH: vedere la data di pubblicazione dei due. Se è un problema, ho sicuramente avuto una macchina del tempo o ho sovraccaricato lo StackOverflow. –

risposta

93

Sì, dipende dalla situazione ci si trova.

Perché utilizzare SQL JOIN?

Risposta: Utilizzare lo SQL JOIN ogni volta più tabelle devono essere accessibili attraverso un'istruzione SQL SELECT e risultati non devono essere restituiti se non c'è una corrispondenza tra le tabelle unite.

Leggere questo articolo originale su The Code Project ti aiuterà molto: Visual Representation of SQL Joins.

alt text

controllare anche questo post: SQL SERVER – Better Performance – LEFT JOIN or NOT IN?.

Trova uno originale a: Difference between JOIN and OUTER JOIN in MySQL.

+3

Eccellente grafica da mostrare ... – DRapp

+0

Che cosa succede in caso di più tavoli? Come gestiamo i join? –

+0

beh dipende dalla codifica, puoi anche usare la sottoquery per ottenere prestazioni sui giunti, ma io dico che dipende dalle righe nella tua tabella –

6

Penso che quello che stai cercando è fare un LEFT JOIN a partire dalla tabella principale per restituire tutti i record dalla tabella principale, indipendentemente se hanno dati validi nei join (come indicato in alto a sinistra 2 cerchi nel grafico)

Partecipa accadere in successione, quindi se avete 4 tavoli di aderire, e si desidera sempre tutti i record dalla tabella principale, è necessario continuare LEFT JOIN in tutto, per esempio:

SELECT * FROM main_table 
LEFT JOIN sub_table ON main_table.ID = sub_table.main_table_ID 
LEFT JOIN sub_sub_table on main_table.ID = sub_sub_table.main_table_ID 

Se si imposta INNER JOIN sub_sub_table, si ridurrà immediatamente il set di risultati. n anche se hai fatto un LEFT JOIN nella tabella secondaria.

Ricordare che quando si esegue LEFT JOIN, è necessario rendere conto dei valori NULL restituiti. Perché se nessun record può essere unito al main_table, un LEFT JOIN obbliga quel campo a comparire indipendentemente e conterrà un NULL. INNER JOIN ovviamente non farà altro che "buttare via" la riga perché non esiste un collegamento valido tra i due (nessun record corrispondente basato sugli ID che hai aggiunto)

Tuttavia, hai detto che hai una dichiarazione where che filtra le righe stai cercando, quindi la tua domanda sul JOIN è nulla & vuoto perché non è questo il tuo vero problema. (Questo è se ho capito bene i tuoi commenti)

+2

Ho dimenticato di aggiungere, iniziare da il tavolo da cui vuoi ottenere i dati FROM (la tua tabella principale potrebbe essere qualsiasi cosa) e poi INNER JOIN o LEFT JOIN. In questo modo è meno complicato invece di tenere traccia delle dichiarazioni RIGHT JOIN o OUTER JOIN – AcidRaZor

+1

+ 1 per ulteriori dettagli sulla spiegazione –

+0

in realtà, ho bisogno di generare un rapporto. E ci sono alcuni campi flag che impostano su Y dopo l'elaborazione. Le mie query funzionano se imposto flag = 'n'. Ma dovrebbe esserci una condizione se il gestore vuole visualizzare i dati elaborati il ​​cui flag è impostato su 'y'. Sto aggiornando la mia domanda con la query ,, –

4

in due set:

  • Utilizzare un full outer join quando si desidera che tutti i risultati di entrambi i set.

  • Utilizzare un giunto interno quando si desidera solo i risultati visualizzati in entrambi i set .

  • Utilizzare un join esterno sinistro quando si desidera che tutti i risultati di serie A, ma se impostato B ha dati rilevanti per alcuni dei record set di A, allora anche voi desidera utilizzare i dati nella stessa query troppo.

prega di fare riferimento alla seguente immagine:

SQL Joins

Problemi correlati