2011-03-30 164 views
2

我試圖選擇使用查詢這樣選擇MAX日期T-SQL子查詢

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

該查詢返回正確的結果。

任何想法爲什麼子查詢沒有返回最大日期或者如果是,爲什麼我沒有返回行?

感謝, 特里斯坦

+1

你怎麼得到它你單獨運行子查詢? – Fillet 2011-03-30 11:42:01

+0

我不明白這些條件:... AND(pminf_date <= '03/30/2011')AND(pminf_date = '01/01/2001') - 永遠不要想 - 但我不能刪除這條評論。所以不會讓我。 – Tim 2011-03-30 11:55:06

+0

如果我自己運行子查詢,我會得到正確的返回日期。 – TGuimond 2011-03-30 11:58:35

回答

6

您在您的查詢不同的條件進行篩選。

它在子查詢中是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 
+0

不幸的是我不需要最近的記錄。無論是否爲'LIFESTYLE'類型,我都需要約定最近的貢獻。我需要看看目前的基金是否是'LIFESTYLE'。 – TGuimond 2011-03-30 11:54:45

+0

是的,該字段可以有多種類型,但我只希望返回結果,如果pminf_field ='M'但我不希望這樣在選擇最近的日期時就是這種情況.. – TGuimond 2011-03-30 12:00:52

+0

@TGuimond:如果最近的記錄不是'LIFESTYLE',是否希望它被退回?另外,如果它晚於「03/30/2001」,你是否希望它被返回? – Quassnoi 2011-03-30 12:01:56

0

查詢:

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') 
1
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

使用子查詢來限制行返回而不是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

第十二! 感謝您的正確語法......我用它來解決我的類似問題德爾(當天) 除非我錯了,我下面有什麼工作..如果它不,我會解決它這裏... 在下面的例子中,數據字段名稱已被清除,但語法運行速度非常快。 順便說一句,有20,480不同device_id

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

對不起,我無法保留帖子以保留正確的格式。 HF。 – 2014-06-04 19:08:58