2012-05-30 9 views
12

これらの2つのステートメントを重複しないで結合する方法はありますか?UNIMを使用してLIMITSと2つのステートメントを結合する

SELECT * FROM Seq where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
     order by TimeP limit 50 

SELECT * FROM Seq where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
     order by TimeI limit 50 

私の最初の、明確な試みがSQLITE(構文エラー:LIMIT句がない前UNIONの後に来る必要があります):でサポートされていない

SELECT * FROM Seq where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
     order by TimeP limit 50 
UNION 
SELECT * FROM Seq where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
     order by TimeI limit 50 

答えて

24

使用サブクエリとその中の制限を行います。

SELECT * 
FROM ( SELECT * 
      FROM Seq 
      WHERE JULIANDAY('2012-05-25 19:02:00') <= JULIANDAY(TimeP) 
      ORDER BY TimeP 
      LIMIT 50 
     ) 
UNION 
SELECT * 
FROM ( SELECT * 
      FROM Seq 
      WHERE JULIANDAY('2012-05-29 06:20:50') <= JULIANDAY(TimeI) 
      ORDER BY TimeI 
      LIMIT 50 
     ) 
+0

これは動作するようです。どうもありがとうございました。なぜあなたは「AS a」を使うのか説明してください。それは必要ですか? – nabulke

+0

習慣から外すだけで済むわけではありません。私は一日中SQL Serverを使い、それはすべてのサブクエリにエイリアスが必要であることを要求します.SQLiteはそうしません。エイリアスを削除しました(そして、2番目のクエリでTimeIの代わりにTimePを使用したので修正が加えられました)。 – GarethD

+1

あなたは世界を支配する。 私の質問がどれほど具体的で奇妙であるかは関係ありません。いつもStackOverflowに誰かがそれを聞いてきました。誰かがそれに答えました。 – Nico

2
  SELECT * from 
      (SELECT * 
      FROM Seq 
      where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
      order by TimeP limit 50) 
      UNION 
      SELECT * from 
      (SELECT * 
      FROM Seq 
      where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
      order by TimeI limit 50) 

これは

+0

ありがとうございます。それは働いているようだ。それを今チェックする... – nabulke

7

クエリを段階的に処理され、トリックを行う必要があります。

  1. FROM句を、すべての参加します。
  2. WHERE句とすべての述語。結果セットの値がNULLであることを確認したい場合は、OUTERに関連付けられたテーブルの列をWHEREセクションにフィルタリングしないでください。クエリがINNERになります。
  3. GROUP BYおよびHAVING句;
  4. クエリの組み合わせ:UNIONINTERSECTEXCEPTまたはそのため
  5. LIMIT

  • ORDER BY
  • MINUS、他の人が指摘したように、 UNION句の前に ORDER BYLIMIT を使用する構文上に間違っています。サブクエリを使用する必要があります。

    SELECT * 
        FROM (SELECT * FROM Seq 
         WHERE JULIANDAY('2012-05-25 19:02:00') <= JULIANDAY(TimeP) 
         ORDER BY TimeP LIMIT 50) AS tab1 
    UNION 
    SELECT * 
        FROM (SELECT * FROM Seq 
         WHERE JULIANDAY('2012-05-29 06:20:50') <= JULIANDAY(TimeI) 
         ORDER BY TimeI LIMIT 50) AS tab2; 
    
    関連する問題