瀏覽單個文章
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

在詢問一下..
有兩張資料表..
Customers和Orders

假設
SELECT COUNT(custid)
FROM Customers;
計算出來的結果有91

然後下面敘述是這樣
SELECT c.custid,
c.companyname,
o.orderid
FROM Sales.Customers c
LEFT JOIN Sales.Orders o
ON c.custid=o.custid AND c.city='Paris';
有人上過M$的課程應該有看過這個SQL statement..
(這個敘述我相信confuse很多學習者..)
在現代的SQL parser, ON與JOIN通常都是成對出現的...

我的理解是這樣的
1. 先掃描FROM取得主表(Customers)來源生成VT1. (從前面知道Customers有91筆)

2. SQL Engine剖析到OUTER JOIN.
上述SQL語句是LEFT JOIN, 取得匹配出來的結果,
然後把從ON語句條件中從VT1沒有匹配到LEFT JOIN右表(right table; Orders)的那些VT1紀錄補回去.
我先用早期的INNER JOIN來看, 先得知匹配成功的結果
SELECT c.custid,
c.companyname,
o.orderid
FROM Customers c, Orders o
WHERE c.custid=o.custid AND c.city='Paris';

74 Customer YSHXL 10738
74 Customer YSHXL 10907
74 Customer YSHXL 10964
74 Customer YSHXL 11043

回傳四筆結果, 他們都是同一個custid..
因此, (91-1)+4=94. 這是從右表沒有匹配成功的紀錄(90)加上匹配成功的紀錄(4)的總資料數量

3. 生成VT2, 將94筆填進去傳回

4. 根據SELECT從VT2篩選, 生成VT3傳回

求SQL大佬看一下我這個理解是否正確???......
舊 2018-10-31, 09:36 PM #9
回應時引用此文章
vxr離線中