2012-05-30 2 views
12

Есть ли способ объединить эти два оператора в один, не имея дубликатов записей?Объединить два оператора с LIMITS с помощью UNION

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''? Это необходимо? – nabulke

+0

Это не нужно и просто делается по привычке. Я весь день использую SQL-Server, и это требует, чтобы все подзапросы были сглажены, SQLite этого не делает. Я удалил псевдонимы (и сделал коррекцию, поскольку во втором запросе использовал TimeP вместо TimeI). – 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 join;
  3. GROUP BY и HAVING статья;
  4. комбинации запросов: UNION, INTERSECT, EXCEPT или MINUS
  5. ORDER BY
  6. LIMIT

Поэтому, как и другие отмечали, что это синтаксически неправильно использовать ORDER BY и LIMITперед темUNION пункта. Вы должны использовать подзапросы:

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; 
Смежные вопросы