簡體   English   中英

左連接兩個表並計數時的SQL執行順序

[英]SQL order of execution when left-joining two tables and counting

我發現了一個類似的問題: 該SQL語句的執行順序是什么? 接受的答案指定FROM是在任何其他子句之前執行的。

SELECT StudentName, Students.StudentID, Cnt 
FROM (
    SELECT Students.StudentID, count(StudentCourses.CourselD) as [Cnt]
    FROM Students LEFT JOIN StudentCourses
    ON Students.StudentID = StudentCourses.StudentID GROUP BY Students.StudentID
) T INNER JOIN Students on T.StudentID = Students.StudentID

在這種情況下count()如何工作?

我很困惑,因為它似乎不符合我的邏輯。 假設首先執行嵌套FROM中的LEFT JOIN(請告訴我這是否有誤),我們將為每個學生至少創建一行作為中間輸出,如果學生不參加任何課程,則該值可能為null 。 如果將count()應用於該輸出,則由於空值行,此類學生將被計數1,這在實際結果中不會發生。 誰能解釋這個查詢如何在后台執行?

提前致謝

您的問題不在於執行順序。 我認為更多是因為

COUNT(StudentCourses.CourselD)

將僅計算非空結果。

具有:

SELECT Students.StudentID, count(*) as [Cnt]
FROM Students LEFT JOIN StudentCourses
ON Students.StudentID = StudentCourses.StudentID GROUP BY Students.StudentID 

將返回所有的計數,而不僅僅是課程ID不為null的行。

COUNT()在子查詢中, 而不在外部查詢中。 您只能在外部查詢中選擇count()返回的值。

子查詢中Cnt列的值將是一個大於或等於0的整數(因為COUNT(NULL)返回0,並且並非所有學生在StudentCourses表中都有行,我相信您在該列中將有零)。 子查詢為每個學生返回一行,其COUNT()值為0或更大。

此外,正如Paolo在評論中提到的那樣- 邏輯順序!=執行順序 ,所以不要假設先執行什么。 數據庫引擎具有多種優化查詢執行的機制,因此您應該更喜歡閱讀文檔,而不要假設某些方法是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM