Объедините два оператора с 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
Ответы
Ответ 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)
Это должно сделать трюк