2016-12-07 4 views
0

Я пытаюсь создать запрос в течение прошлой недели или так теперь, используя следующий запрос в качестве ссылки и нуждаюсь в некоторой помощи, разбирая его, поэтому я знаю, что делает каждая секция.Руководство по пониманию SQL-запроса

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 
     ); 

Возможно, кто-нибудь объяснит, что делает каждая секция?

+0

Start, используя имя псевдонима может быть, вы будете понимать запрос –

+2

Oy, что венгерская нотация (https://en.wikipedia.org/wiki/ Hungarian_notation) убивает мои глаза. – Yuck

+0

это не мой запрос sql, мне просто нужна помощь, понимающая его @Prdp –

ответ

1

В первую очередь, упростить и формат:

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 не может быть пустым, и

Предложение b.fldBigClubID In subquery. Похоже, что он находит все значения fldBigClubID, где fldStockCode начинается с TO и fldOrderDate всего за последние 2 года, в том числе период составляет 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); 
0

Выполнение всего запроса маловероятно, но если у вас есть конкретные детали, которые дают вам проблемы, мы можем помочь. В ответ на ваш комментарий

DateAdd(Year, -2, GetDate()) 

Это возвращает дату 2 года минус сегодняшнюю дату. Вы можете запустить

SELECT DateAdd(Year, -2, GetDate()) 

Возвращает

2014-12-07 10:56:07.290 

Так это выглядит, как они тянут клиентов, которые заказали 30 пунктов или более в течение последних 2-х лет.

+0

Спасибо за помощь, это имеет смысл, не могли бы вы объяснить это? «WHERE (tblBigClubs.fldBigClubID IN (SELECT DISTINCT ...» –

+0

@MattEllis Они пытаются получить все BigClubs, но фильтруют клубы, которые заказали 30 или более предметов за последние 2 года – SQLChao

+0

Теперь все в порядке, спасибо, ниже ответ упростил его понимание. –

Смежные вопросы