[英]Guidance on understanding SQL query
在過去一周左右的時間里,我一直在嘗試使用以下查詢作為參考來創建查詢,並且需要一些幫助來分解它,因此我知道每個部分的工作。
Select Distinct
tblCustomers.fldEmail
, tblCustomers.fldCustomerID
, tblCustomers.fldName
, tblCustomers.fldContactName
From tblBigClubs
Inner Join tblBigClubMatch
On tblBigClubs.fldBigClubID = tblBigClubMatch.fldBigClubID
Inner Join tblCustomers
On tblBigClubMatch.fldCustomerID = tblCustomers.fldCustomerID
Where (tblBigClubs.fldBigClubID In (Select Distinct
dbo.tblBigClubMatch.fldBigClubID
From dbo.tblOrders
Inner Join dbo.tblOrderItems
On dbo.tblOrders.fldOrderID = dbo.tblOrderItems.fldOrderID
Inner Join dbo.tblBigClubMatch
On dbo.tblOrders.fldCustomerID = dbo.tblBigClubMatch.fldCustomerID
Where (dbo.tblOrders.fldOrderDate > DateAdd(Year, -2, GetDate()))
And (dbo.tblOrderItems.fldStockCode Like 'TO%')
Group By dbo.tblBigClubMatch.fldBigClubID
Having (Sum(dbo.tblOrderItems.fldQtyOrder) >= 30))
And tblCustomers.fldEmail Is Not Null
And dbo.tblCustomers.fldEmail <> ''
And Len(dbo.tblCustomers.fldEmail) > 8
);
請有人可以解釋每個部分在做什么嗎?
首先,簡化並格式化:
Select Distinct c.fldEmail, c.fldCustomerID, c.fldName, c.fldContactName
From tblBigClubs b
Join tblBigClubMatch m On m.fldBigClubID = b.fldBigClubID
Join tblCustomers c On c.fldCustomerID = m.fldCustomerID
Where Len(c.fldEmail) > 8
and b.fldBigClubID In
(Select Distinct im.fldBigClubID
From dbo.tblOrders o
Join dbo.tblOrderItems i On i.fldOrderID = o.fldOrderID
Join dbo.tblBigClubMatch im On im.fldCustomerID = o.fldCustomerID
Where o.fldOrderDate > DateAdd(Year, -2, GetDate())
And i.fldStockCode Like 'TO%'
Group By im.fldBigClubID
Having Sum(i.fldQtyOrder) >= 30);
以上在功能上是等效的。 (使用別名消除了很多混亂,並使SQL更易於閱讀和理解),然后檢查謂詞。 只有兩個:
Len(c.fldEmail) > 8
如果滿足,則顯然fldEmail不能為null,並且
b.fldBigClubID In subquery
子句中。 看起來好像正在查找fldBigClubID
所有值,其中fldStockCode
以TO
開頭,而fldOrderDate
在最近兩年中,在同一時期內有30個或更多訂單。
總而言之,對於過去兩年中具有30個或更多訂單的股票代碼為TO
商品的客戶,似乎從客戶表中獲得了四個字段。
所以實際上,這也應該等同於:
Select fldEmail, fldCustomerID,
fldName, fldContactName
From tblCustomers
Where fldCustomerID In
(Select distinct o.fldCustomerID
From dbo.tblOrders o
Join dbo.tblOrderItems i On i.fldOrderID = o.fldOrderID
Join dbo.tblBigClubMatch m On m.fldCustomerID = o.fldCustomerID
Where o.fldOrderDate > DateAdd(Year, -2, GetDate())
And i.fldStockCode Like 'TO%'
Group By m.fldBigClubID
Having Sum(i.fldQtyOrder) >= 30);
不可能遍歷整個查詢,但是如果您遇到麻煩的特定部分,我們可以為您提供幫助。 回應您的評論
DateAdd(Year, -2, GetDate())
返回的日期是2年減去今天的日期。 你可以跑
SELECT DateAdd(Year, -2, GetDate())
退貨
2014-12-07 10:56:07.290
因此,看起來他們正在吸引過去兩年中訂購30件或更多商品的客戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.