2012-01-27 9 views
0

このデータは正しいデータを返しますが、フィルタリングしたいと思います。一意のIDと今後の予定の最も古い日付によるSQLクエリのフィルタリング

SELECT  TOP (100) PERCENT dbo.Reg_Master.id, dbo.Cart_Programs.cartid, dbo.Reg_Master.F_ID, dbo.BlockPeriod.profileid, dbo.Reg_Master.FirstName, 
         dbo.Reg_Master.LastName, dbo.BlockPeriod.startdate, dbo.Cart_Programs.blockid 
FROM   dbo.Cart_Programs LEFT OUTER JOIN 
         dbo.Reg_Master ON dbo.Cart_Programs.cartid = dbo.Reg_Master.cartid LEFT OUTER JOIN 
         dbo.BlockPeriod ON dbo.Cart_Programs.blockid = dbo.BlockPeriod.id 
WHERE  (dbo.BlockPeriod.profileid = xxx) AND (dbo.Reg_Master.F_ID = xxxx) 
ORDER BY dbo.BlockPeriod.startdate 

dbo.Reg_Master.idについて、私は返すしたい最古のdbo.BlockPeriod.startdate(それは後で今日かである - 既に合格している日付無視して、他の言葉で)各dbo.Reg_Master.idのために、私はそれが正しくフォーマットように見えることはできません。

答えて

1

まず、TOP 100パーセントは何もしません。オプティマイザは無視します。 WHEREの条件のため、左の結合は目的を果たさないため、inner join + cross applyouter join + outer applyを使用するようにSQLを編集しました。

Reg_Masterレコードごとに正しく理解している場合、その1レコードが今日の日付よりも近い最も近い日付であるBlockPeriodから、最大で1レコードが欲しいです。

更新:助けを

SELECT Reg_Master.id, 
     Cart_Programs.cartid, 
     Reg_Master.F_ID, 
     T.profileid, 
     Reg_Master.FirstName, 
     Reg_Master.LastName, 
     T.startdate, 
     Cart_Programs.blockid 
FROM Cart_Programs 
JOIN Reg_Master ON Cart_Programs.cartid = Reg_Master.cartid 
CROSS APPLY(
    SELECT TOP 1 * FROM BlockPeriod 
    WHERE BlockPeriod.id = Cart_Programs.blockid 
     AND BlockPeriod.profileid = xxx AND Reg_Master.F_ID = xxxx 
     AND BlockPeriod.startdate >= GETDATE() 
ORDER BY BlockPeriod.startdate ASC 
) AS T 
+0

おかげで、この例では、以下に示すよう

はもしそうなら、どのようなあなたが探していることはTOP (1)と組み合わせAPPLY表演算子です。結果はまったくフィルタリングされず、すべてのレコードでstartdateの値がNULLになります。他のアイデア? –

+0

@resonantmedia - 私の悪い、私はSQLを編集しましょう –

+0

@resonantmediaもう一度やり直してください投稿+ SQL –

関連する問題