使用UNION将两个语句与LIMITS结合使用

nab*_*lke 15 sql sqlite

有没有办法将这两个语句合并为一个而没有重复的条目?

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
Run Code Online (Sandbox Code Playgroud)

我的第一个显而易见的尝试不受支持SQLITE(语法错误:限制子句应该在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
Run Code Online (Sandbox Code Playgroud)

Gar*_*thD 27

使用子查询并在其中执行限制.

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
        )
Run Code Online (Sandbox Code Playgroud)


vye*_*rov 7

查询分阶段处理:

  1. FROM 条款和所有连接;
  2. WHERE子句和所有谓词.因此,如果您想NULL在结果集中查看值,则不应OUTER在该WHERE部分中过滤-joined表列,因为这会将您的查询转换为INNER连接;
  3. GROUP BYHAVING条款;
  4. 查询组合:UNION,INTERSECT,EXCEPTMINUS
  5. ORDER BY
  6. LIMIT

因此,正如其他人所指出的那样,使用ORDER BYLIMIT before 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;
Run Code Online (Sandbox Code Playgroud)