0

我有四个表:A、B、C、D。D 对 C 有一个 FK,C 对 B 有一个 FK,B 对 A 有一个 FK。每个表都有一个 ID 列。除了 ID 和 CID,表 D 还具有 Value 和 Timestamp(整数)。给定某个时间,我需要时间戳之前的 D 行,但每个 CID 最接近它的行——除非时间戳之前没有行,在这种情况下,我需要时间戳之后的第一个值。我正在使用 Sqlite。

忽略最后一个要求,我尝试使用此查询获取时间戳之前的值,但返回的 ID 是错误的:

SELECT  * 
FROM    D d 
INNER JOIN C c ON d.CID = c.ID 
INNER JOIN B b ON C.BID = b.ID
WHERE   b.AID = @AID AND d.Timestamp = 
        (
        SELECT  MAX(d2.Timestamp) 
        FROM    D d2 
        WHERE   d2.Timestamp < @StartTime 
                AND d2.CID = D.CID
        )
4

2 回答 2

1

此查询应在查询的第一部分(在 UNION ALL 之前)获取 @StartTime 之前的最后一个条目,然后将其与 @StartTime 之后的第一个条目结合起来。剩下的就是为每个 CID 选择最小的条目。

SELECT d2.*
FROM (
  SELECT D.ID, MAX(D.Timestamp)
  FROM D d
    INNER JOIN C c ON c.ID = d.CID
      INNER JOIN B b on b.ID = c.BID
  WHERE b.AID = @AID AND d.Timestamp <= @StartTime 
  GROUP BY d.CID) AS results
INNER JOIN D d2 ON d2.ID = results.ID

UNION ALL 

SELECT d2.*
FROM (
  SELECT D.ID, MIN(D.Timestamp)
  FROM D d
    INNER JOIN C c ON c.ID = d.CID
      INNER JOIN B b on b.ID = c.BID
  WHERE b.AID = @AID AND d.Timestamp > @StartTime 
  GROUP BY d.CID) AS results
INNER JOIN D d2 ON d2.ID = results.ID
于 2012-05-15T23:12:38.857 回答
0

这可能有效,但仍然对您想要的内容感到有些困惑。

SELECT  *,
(CASE WHEN d.Timestamp < @StartTime THEN 1 ELSE 0) AS timeCheck
FROM    D d 
INNER JOIN C c ON d.CID = c.ID 
INNER JOIN B b ON C.BID = b.ID
WHERE   b.AID = @AID
ORDER BY timeCheck DESC, d.Timestamp DESC
LIMIT 0,1

更新

于 2012-05-15T17:15:33.930 回答