2013-02-12 53 views
0

我有這個數據庫查詢:我正在尋找一個「軟」限制對這個數據庫查詢

SELECT * FROM Events e 
    WHERE e.TimestampTicks >= @StartTicks 
    ORDER BY e.TimestampTicks 
    LIMIT @Limit 

@StartTicks@Limit的變量傳遞

我需要查詢的行爲一點不同。我想@Limit是最低限度。對於任何給定的TimestampTicks值(64位有符號整數),我需要該值的所有行。我無法拆分任何TimestampTicks組。我如何修改查詢以實現此目的?

回答

0

下面是你想要的。

SELECT * 
FROM Events e 
WHERE e.TimestampTicks between @StartTicks 
    AND (SELECT MAX(TimestampTicks) 
           FROM 
           (
           SELECT TimestampTicks 
           FROM Events 
            WHERE TimestampTicks >= @StartTicks 
            ORDER BY TimestampTicks 
            LIMIT @Limit 
          )emax 
         ) 
ORDER BY e.TimestampTicks 
+0

TimestampTicks列上有一個索引。你期望MAX會使用那個索引嗎?你是否期望即使在內部查詢中沒有ORDER BY,MAX也會使用該索引? – Brannon 2013-02-12 20:54:46

+0

如果有索引,它可能。但如果沒有,@Gordon Linoff的解決方案將會更好。除了獲得最大值外,這兩個查詢幾乎都是精確的。 – 2013-02-12 21:14:29

0

您是否在尋找TimestampTicks的第一個大於@StartTicks的值,然後返回與該值匹配的所有行?如果是的話,你會做這樣的:

SELECT e1.* 
    FROM Events e1 
    JOIN (SELECT MIN(TimestampTicks) AS TimestampTicks 
      FROM Events e2 
     WHERE TimestampTicks >= @StartTicks) e2 
    ON e1.TimestampTicks = e2.TimestampTicks 

此外,因爲你拉的所有符合條件的記錄,我不相信有需要的ORDER BY。

+0

不,這不起作用。 http://sqlfiddle.com/#!9/95f48/19/0 – 2013-02-12 20:44:58

0

計算你正在尋找的閾值,然後用where條款得到的結果:

select * 
from Events e 
where e.TimestampTicks between @StartTicks and 
     (select TimestampTicks 
      from (SELECT * 
       FROM Events e 
       WHERE e.TimestampTicks >= @StartTicks 
       ORDER BY e.TimestampTicks 
       LIMIT @Limit 
       ) t 
      order by TimestampTicks desc 
      limit 1 
     ) 

這是通過讓在最裏面的子查詢符合條件的行的@LIMIT數。然後命令它們以其他的方式獲得極限值TimestampTicks)。 (爲此我也可以使用select max(TimestampTicks))。然後將此閾值用作where條件。

+1

你幾乎是正確的。你只是忘了放回「e.TimestampTicks> = @StartTicks」。這是起點。 – 2013-02-12 20:35:30

+0

@OsaE。 。 。該行位於最裏面的子查詢中。這是起點。 – 2013-02-12 20:37:50

+0

我明白了。但最外層的查詢是從整個表中獲取數據,然後僅從內部查詢返回的max進行過濾。我測試了您的查詢http://sqlfiddle.com/#!9/95f48/18/0 – 2013-02-12 20:39:45

相關問題