簡體   English   中英

理解SQL查詢的指南

[英]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所有值,其中fldStockCodeTO開頭,而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.

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