tables - sql right join




在LEFT JOIN SQL Query上幫助一個WHERE (2)

@Mark:我明白為什麼JOIN語法可行,但是感謝警告。 我認為你的建議更直觀。 我很好奇,看哪個更有效率。 所以我進行了一個快速的測試(恐怕只有十四行10次試驗,這個過程很簡單):

在JOIN條件下:

AND HasDownloaded.memberID = @memberID
  • 客戶端處理時間:4.6
  • 總執行時間:35.5
  • 等待服務器回复時間:30.9

在WHERE子句中:

WHERE HasDownloaded.memberId IS NULL OR HasDownloaded.memberId = @memberId
  • 客戶端處理時間:7.7
  • 總執行時間:27.7
  • 服務器等待時間回复:22.0

它看起來像WHERE子句一樣稍微高效。 有趣! 再次感謝你們的幫助。

我試圖構造一個查詢,其中將包含一個列,指示用戶是否下載了文檔。 我有一個名為HasDownloaded的表,包含以下列:id,documentID,memberID。 查明用戶是否下載了特定的文件很容易; 但我需要生成一個查詢結果將如下所示:

name              id
----------------------
abc               NULL
bbb               2
ccc               53
ddd               NULL
eee               13

身份證並不重要, 我感興趣的是文檔是否已經被下載(是否為NULL)。

這是我的查詢:

SELECT Documents.name, HasDownloaded.id FROM Documents
LEFT JOIN HasDownloaded ON HasDownloaded.documentID = Documents.id
WHERE HasDownloaded.memberID = @memberID

問題是,只有在HasDownloaded表中存在指定用戶的條目時,才會返回值。 我想保持這個簡單,只有在已下載文檔的HasDownloaded中有條目。 所以如果用戶1已經下載了abc,bbb和ccc,我還是希望ddd和eee出現在結果表中,只是id為NULL。 但是WHERE子句只給出了哪些條目存在的值。

我不是一個SQL專家 - 是否有一個運營商,會給我什麼,我想在這裡? 我應該採取不同的方法? 或者這是不可能的?


將WHERE子句中的條件移至連接條件。

SELECT Documents.name, HasDownloaded.id FROM Documents
LEFT JOIN HasDownloaded ON HasDownloaded.documentID = Documents.id 
  AND HasDownloaded.memberID = @memberID 

這是必要的,只要你想引用一個左連接ed表,否則會是WHERE子句。





left-join