ВЫБЕРИТЕ МАКС. Дата T-SQL Подзапрос - PullRequest
2 голосов
/ 30 марта 2011

Я пытаюсь ВЫБРАТЬ строки из таблицы, используя запрос, подобный этому

SELECT     pminf_member, pminf_schmem
         , pminf_date, pminf_fund
         , pminf_cont, pminf_rate
         , pminf_matrix
FROM   pe_minvf
WHERE (pminf_member = 4380) 
  AND (pminf_schmem = 'M') 
  AND (pminf_date <= '03/30/2011')
  AND (pminf_date =
           (SELECT MAX(pminf_date) AS Expr1
            FROM   pe_minvf AS pe_minvf_1
            WHERE  (pminf_member = 4380)
           )
       )
  AND (pminf_fund = 'LIFESTYLE')

То, что я должен получить из своего подзапроса (я думаю), является датой «01.01.2011», нокогда я выполняю свой запрос, я не получаю никаких результатов обратно.

Если я заменяю подзапрос жестко закодированной датой, я получаю правильные возвращенные строки.Например,

SELECT  pminf_member, pminf_schmem
      , pminf_date, pminf_fund
      , pminf_cont, pminf_rate
      , pminf_matrix
FROM  pe_minvf
WHERE (pminf_member = 4380)
  AND (pminf_schmem = 'M')
  AND (pminf_date <= '03/30/2011')
  AND (pminf_date = '01/01/2011')
  AND (pminf_fund = 'LIFESTYLE')

Этот запрос возвращает правильные результаты.

Любые идеи, почему подзапрос не возвращает максимальную дату или, если это так, почему я не получаю строк назад?

Спасибо, Тристан

Ответы [ 5 ]

6 голосов
/ 30 марта 2011

Вы фильтруете различные условия в своих запросах.

Это pminf_fund = 'LIFESTYLE' в подзапросе, но pminf_schmem = 'M' во внешнем запросе.

Кроме того, вы ограничиваете дату во внешнем запросе.и не делайте этого в подзапросе.

Если вам просто нужна самая последняя запись до '03 / 30/2011 ', используйте это:

SELECT  TOP 1
        pminf_member, pminf_schmem, pminf_date, pminf_fund, pminf_cont, pminf_rate, pminf_matrix
FROM    pe_minvf
WHERE   pminf_member = 4380
        AND pminf_schmem = 'M'
        AND pminf_fund = 'LIFESTYLE'
        AND pminf_date <= '03/30/2011'
ORDER BY
        pminf_date DESC
1 голос
/ 30 марта 2011
SELECT     pminf_member, pminf_schmem
         , pminf_date, pminf_fund
         , pminf_cont, pminf_rate
         , pminf_matrix
FROM   pe_minvf 
WHERE (pminf_member = 4380) 
  AND (pminf_schmem = 'M') 
  AND (pminf_date =
           (SELECT MAX(pminf_date) AS Expr1
            FROM   pe_minvf AS p
            WHERE  (p.pminf_member = 4380) AND 
                   p.pminf_date <= '03/30/2011'
           )
       )
  AND (pminf_fund = 'LIFESTYLE')
0 голосов
/ 04 июня 2014

Двенадцатая!Спасибо за правильный синтаксис ... Я использовал его для решения моей аналогичной проблемы де-юр (на сегодняшний день) Если я не ошибаюсь, то, что у меня есть ниже, будет работать .. Если это не так, я исправлю это здесь... В приведенном ниже примере имя поля данных было очищено, но синтаксис работал очень быстро.Между прочим, существует 20 480 различных идентификаторов устройств:

declare 
 @BegDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-2,101) as varchar(20)) + ' 10:59:59 PM')
,@EndDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-0,101) as varchar(20)) + ' 11:00:00 PM')
  select f1.ABC_ConfigProcStatusID,f1.DeviceID,f1.DBfilename ,f1.LastUpdatedDate
    from dbo.ABC_ConfigProcStatus f1
        inner join
          (select distinct DeviceID,max(LastUpdatedDate) as max_DeviceIDdte
            from dbo.ABC_ConfigProcStatus 
            where [Status]=2  
            and DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList)
            group by DeviceID) f2 
        on f2.max_DeviceIDdte = f1.LastUpdatedDate
   where [Status]=2  
   and f2.DeviceID = f1.DeviceID
   and f1.DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList)
   and LastUpdatedDate between @BegDate and @EndDate
   and left(upper(f1.DeviceID),3) in ('XYZ','ZKO')
   order by f1.LastUpdatedDate
0 голосов
/ 30 марта 2011

использовать подзапрос для ограничения количества возвращаемых строк вместо предложения where.Используйте это как подзапрос:

(SELECT MAX(pminf_date) AS Expr1             
FROM   pe_minvf AS pe_minvf_1             
WHERE  (pminf_member = 4380) 

Сохранить запрос в основном таким же ...

Select same_fields_as you_did_before
from pe_minvf
inner join 
 (SELECT MAX(pminf_date) AS Maxdate, tablekey             
 FROM   pe_minvf AS pe_minvf_1             
 WHERE  pminf_member = 4380) a on a.tablekey = pe_minvf.table_key
where same_where_clause_you_had

Имеет смысл?Я не был уверен, какой у тебя был table_key на pe_minvf ... ты должен вставить его сам.Я считаю, что использование подкаталогов и внутреннее соединение с ними является более эффективным способом ограничения строк, чем использование подзапроса в предложении where

0 голосов
/ 30 марта 2011

Запрос:

SELECT MAX(pminf_date) AS Expr
FROM   pe_minvf AS pe_minvf_1
WHERE  (pminf_member = 4380)
;

возвращает '01/01/2011' или что-то еще?

Возможно, вам нужны те же условия в подзапросе, что и в запросе emain:

SELECT MAX(pminf_date) AS Expr
FROM   pe_minvf AS pe_minvf_1
WHERE  (pminf_member = 4380)
  AND  (pminf_schmem = 'M')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...