0

A、B、C、D の 4 つのテーブルがあります。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 に答える