Подтвердить что ты не робот

Объедините два оператора с 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
4b9b3361

Ответ 1

Используйте подзапросы и выполняйте лимит внутри них.

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
        )

Ответ 2

Запросы обрабатываются поэтапно:

  • FROM и все соединения;
  • WHERE и все предикаты. Поэтому, если вы хотите видеть значения NULL в наборе результатов, вы никогда не должны фильтровать столбцы столбцов OUTER -joined в разделе WHERE, так как это превратит ваш запрос в INNER join;
  • GROUP BY и HAVING;
  • Комбинации запросов: UNION, INTERSECT, EXCEPT или MINUS
  • ORDER BY
  • 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;

Ответ 3

           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)

Это должно сделать трюк