【问题标题】:Combine two statements with LIMITS using UNION使用 UNION 将两个带有 LIMITS 的语句组合起来
【发布时间】:2022-11-16 14:12:06
【问题描述】:

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

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

【问题讨论】:

    标签: 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表列,因为这会将你的查询变成INNERjoin;
      3. GROUP BYHAVING条款;
      4. 查询组合:UNIONINTERSECTEXCEPTMINUS
      5. ORDER BY
      6. LIMIT

        因此,正如其他人指出的那样,使用 ORDER BYLIMIT 在语法上是错误的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)
        

        这应该可以解决问题

        【讨论】:

          【解决方案4】:

          我有一个 SQL(实际上是 SQLite)数据库,其中有一个名为 buysell_product 的表。 我想要做的是根据views_1 列选择前 5 名,然后再次使用 views_2 列选择前 5 名。然后合并两个选择。两个查询中选择的所有列都相同。

          我期待下面的工作,但它没有。

          询问

          SELECT id, name, views_1, views_2
              FROM buysell_product
              ORDER BY views_1 DESC
              LIMIT 5
          UNION
          SELECT id, name, views, views_2
              FROM buysell_product as b
              ORDER BY views_2 DESC
              LIMIT 5
          

          错误

          Execution finished with errors.
          Result: ORDER BY clause should come after UNION not before
          At line 1:
          SELECT id, name, views_1, views-2
              FROM buysell_product
              ORDER BY views_1 DESC
              LIMIT 5
          UNION
          SELECT id, name, views_1, views_2
              FROM buysell_product as b
              ORDER BY views_2 DESC
              LIMIT 5
          

          而且,我尝试了以下有效的方法。

          查询 1

              SELECT id, views_1, name
              FROM buysell_product
              ORDER BY views_1 DESC
              LIMIT 5
          

          查询 2

          SELECT id, views_2, name
              FROM buysell_product
              ORDER BY views_2 DESC
              LIMIT 5
          

          但是,我们需要通过以下方式将上述两个查询合并为一个:

          SELECT *
              FROM (
                  SELECT id, views_1, views_2, name
                  FROM buysell_product
                  ORDER BY views_1 DESC
                  LIMIT 5
                  )
          UNION
          SELECT * 
              FROM (
                  SELECT id, views_1, views_2, name
                  FROM buysell_product as b
                  ORDER BY views_2 DESC
                  LIMIT 5
                  )
          

          输出

          id  views_1 views_2 name
          2   41  16  Excellent 2013 ford ecosport
          3   72  10  Excellent Hyundai creta 
          5   39  39  iPhone 11 128gb
          7   12  84  Excellent Hyundai creta sx
          9   37  84  Volkswagen Polo 1.2 GT AMT 2017
          44  34  81  Usupso Massage Anti Skid Slippers
          45  15  75  Garlic Powder - 100Gm
          57  35  11  Iphone 13 and 14
          67  15  73  Universal Touch Screen Capacitive Stylus
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-05
            • 2012-12-12
            相关资源
            最近更新 更多