2012-03-21 7 views
3

私は、NULLでない日付フィールドを持つイベントテーブルを持っています。ピボット日付とオフセットに基づいて、クエリは次の2つのイベントを返す必要があります。結合内の空サブクエリのテスト

は、ここで私が構築しようとしているクエリです:日付ASCでソートされた次のイベントシーケンスと

SELECT e.* FROM Events as e 
JOIN (
    -- latest event before pivot date, with offset 
    SELECT * FROM Events where date < :dateRef 
     ORDER BY date DESC, id DESC LIMIT :offset,1 
) as eLatest 
-- depending on :dateRef and :offset, eLatest can be empty! 
-- If eLatest is empty, the join should produce all rows from Events table. 
-- "eLatest is null" gives an error... How can I do it? 
ON e.date > eFirst.date || (e.date = eFirst.date && e.id >= eFirst.id) 
ORDER BY e.date, e.id LIMIT 2 

(無等しい日付がそれをシンプルに保つないため): E0を - E1 - E2を - .. 。

  • :dateRef = e2.date:オフセット= 0: - ここでE10

    は、いくつかの所望の結果である[E1、E2]

  • :デートEF = e2.date:オフセット= 1:[E0、E1]
  • :dateRef = e2.date:オフセット> 1:動作しない[E0、E1] <は---、何行を返さない
  • :dateRef < = e0.date、:offset =? :=オフセットdateRef = e5.date、:オフセット= 2:E2、E3]
  • :dateRef> e10.date、[E0、E1] < ---動作しないが、何行
  • を返しません0:[E10]
  • :dateRef> e10.date、:= 2オフセット:[E8、E9]

私が持っている問題は、サブクエリeLatestが空のときということで、参加決してマッチしません。 eLatestが空のときに結合条件を削除する方法を理解できません。

最終クエリはJPQLまたはJPAの基準でなんとかなければなりません(そう何の組合が!私はすでにUNIONで動作するクエリを持っていないし、それを取り除くしようとしています...)

+0

'JOIN'の代わりに' LEFT JOIN'を実行するとどうなりますか? – Lamak

+0

'JOIN'を' LEFT JOIN'に置き換えると、クエリは常にe0とe1を返します。 – bernie

+0

私はあなたの最後の箇条書き項目は、*:dateRef> e10.date、:offset = 2:[e8、** e9 **] *と読みます。 –

答えて

3

でしょうRIGHT JOIN解決策はありますか?

SELECT e.* FROM Events as e 
JOIN (
    -- latest event before pivot date, with offset 
    SELECT COALESCE(ev.date, b.date), COALESCE(ev.id, b.id) FROM ( 
     SELECT * FROM Events where date < :dateRef 
     ORDER BY date DESC, id DESC LIMIT :offset,1 
    ) ev RIGHT JOIN ( SELECT CAST('1900-01-01' AS date) AS date, 0 AS id ) AS b ON 1=1 
) as eFirst 
ON e.date > eFirst.date || (e.date = eFirst.date && e.id >= eFirst.id) 
ORDER BY e.date, e.id LIMIT 2 
+0

素晴らしいアイデア!右結合は、ON句で必要な述語を許可する空の結果セットを強制します。あなたの答えを編集して不足しているCOALESCEを追加しました。受け入れる前にJPAでこれをすべてテストします。 – bernie

+0

Gaa! JPAのサブクエリで 'LIMIT'を使うことはできません...代わりにネイティブクエリを使わなければならないでしょう。あなたの右の結合のアイデアはまだすべてが失われないようにテーブルのクエリを削除します:)再びありがとう。 – bernie

関連する問題