【问题标题】:Combine two statements with LIMITS using UNION使用 UNION 将两个语句与 LIMITS 合并
【发布时间】:2012-05-30 08:48:20
【问题描述】:

有没有办法将这两个语句合并为一个而不会出现重复条目​​?

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 不支持我的第一个明显尝试(语法错误:限制子句应该在 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

【问题讨论】:

    标签: sql sqlite


    【解决方案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】:

      查询分阶段处理:

      1. FROM 子句和所有连接;
      2. WHERE 子句和所有谓词。因此,如果您想在结果集中查看NULL 值,则永远不要在WHERE 部分中过滤OUTER-joined 表列,因为这会将您的查询变成INNER 连接;
      3. GROUP BYHAVING 子句;
      4. 查询组合:UNIONINTERSECTEXCEPTMINUS
      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;
      

      【讨论】:

        【解决方案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)
        

        这应该可以解决问题

        【讨论】:

          猜你喜欢
          • 2022-11-16
          • 1970-01-01
          • 2016-12-29
          • 2014-02-05
          • 2014-06-18
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多