2010-07-22 101 views
30

我知道連接的用法,但有時遇到這樣的情況時,我無法確定哪個加入合適,左或右如何決定何時使用正確的連接/左連接或內連接或者如何確定哪個表位於哪一側?

這裏是我卡在哪裏的查詢。

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

右連接是除與所述表的順序一樣左連接切換。 FROM TableA LEFT JOIN TableB == FROM TableB RIGHT JOIN TableA(儘管如果您使用SELECT *,列的順序將會不同,因爲它按照表順序發出列) – GalacticCowboy 2010-07-22 17:08:47

+0

可能的重複[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 2012-02-09 16:33:20

+1

@JonH:查看兩者的發佈日期。如果它的愚蠢,我肯定有時間機器或我overflooded StackOverflow。 – 2012-02-10 09:58:01

回答

93

是的,它取決於你的情況。

爲什麼要使用SQL JOIN?

:使用SQL JOIN每當多個表必須通過SQL SELECT語句來訪問,如果沒有連接表之間的匹配沒有結果應返回。

The Code Project上閱讀這篇原文將幫助你很多:Visual Representation of SQL Joins

alt text

還要檢查這個帖子:SQL SERVER – Better Performance – LEFT JOIN or NOT IN?

找到原來的:Difference between JOIN and OUTER JOIN in MySQL

+3

極好的圖形顯示... – DRapp 2010-07-22 11:10:59

+0

什麼情況下有多個表?我們如何處理連接? – 2010-07-22 11:16:43

+0

以及它取決於編程你也可以使用子查詢來獲得關節的性能,但我說它取決於你的表中的行 – 2010-07-22 11:19:07

6

我認爲你正在尋找的是從主表開始執行LEFT JOIN以返回主表中的所有記錄,而不管它們是否具有有效數據(如左上角的2個圓圈所示)在圖形)

JOIN的發生在繼承,所以如果你有4個表加入,你總是希望從你的主表中的所有記錄,你仍然需要繼續LEFT JOIN貫穿始終,例如:

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 

如果你INNER JOIN的sub_sub_table,它會馬上收縮你的結果集dow即使你在子表上做了LEFT JOIN

請記住,在做LEFT JOIN時,您需要考慮返回的值爲NULL。因爲如果沒有記錄可以與main_table連接,則LEFT JOIN強制該字段不管並且將包含NULL。 INNER JOIN顯然只是「扔掉」該行,而不是因爲兩者之間沒有有效的鏈接(沒有基於您加入的ID的相應記錄)

但是,您提到您有一個where語句可過濾出行你正在尋找,所以你對JOIN的問題是空的,因爲這不是你真正的問題。 (這是,如果我正確地理解您的意見)

+2

我忘了添加,從要從中獲取數據的表(您的主表可以是任何東西),然後是INNER JOIN或LEFT JOIN。 這是不復雜的方式,而不是跟蹤RIGHT JOIN或OUTER JOIN語句 – AcidRaZor 2010-07-22 12:17:52

+1

+ 1更多詳細信息的解釋 – 2010-07-22 12:28:31

+0

實際上,我需要生成報告。處理完成後,有一些標誌字段設置爲Y.我的查詢工作,如果我設置標誌='n'。但是如果管理者想要查看其標誌被設置爲'y'的處理過的數據,應該有條件。我用查詢更新我的問題,, – 2010-07-23 03:26:25

4

在兩組:

  • 使用,當你想從所有這兩組的結果完全外部聯接。

  • 當您只想要出現在兩個 集合中的結果時,請使用內連接。

  • 在您希望所有的設定結果的左外連接,但 如果設置B有相關的一些集的記錄數據,那麼你也 要使用的數據在同一個查詢了。

請參考以下圖片:

SQL Joins