在 NZSQL 中使用 union all 限制时出错

Posted

技术标签:

【中文标题】在 NZSQL 中使用 union all 限制时出错【英文标题】:error when using limit with union all in NZSQL 【发布时间】:2014-06-18 14:24:04 【问题描述】:

我试图在一周内随机抽取随机条目。为了保证工作日和周末条目的平衡,我草拟了2条单独的sql语句如下:

select * FROM admin.acct_activity
where RANDOM() <=1
        --weekday
        and extract(day from page_hit_ts) Between 6 and 10
limit 500
UNION all

SELECT *
FROM admin.acct_activity
where RANDOM() <=1
        --weekend
        and extract(day from page_hit_ts) Between 11 and 12
limit 200
/* to-do
 1. limit results for each query
 2. order query results by date*/

错误信息是:

"all" (at char 121) expecting a keyword (State:42000, Native Code: 1B)

这是在 Netezza SQL (NZSQL) 中

第一个 select 语句中的 limit 语句似乎导致了错误。有什么建议吗?

【问题讨论】:

如果你有错误而不发布它,它真的让我的水晶球工作得比它应该做的更好。 :) 请发布您所拥有的有关您的问题的所有信息。 @Goon10 仅供参考,LIMIT 在 Netezza 中是有效的语法! @SatwikNadkarny :好的,很高兴知道。 假设查询单独返回您想要的内容,您可能需要将它们包装在 () 中,可能会在限制之前尝试 UNION,然后将限制视为语法错误。 ***.com/questions/1415328/… 虽然不一样,但数据库的性能相似 @xQbert 正是这个,谢谢 【参考方案1】:

我认为你可以用括号来做到这一点:

(select *
 FROM admin.acct_activity
 where RANDOM() <=1 and extract(day from page_hit_ts) Between 6 and 10
 limit 500
)
UNION all
(SELECT *
 FROM admin.acct_activity
 where RANDOM() <=1 and extract(day from page_hit_ts) Between 11 and 12
 limit 200
)

如果没有,你绝对可以用子查询来做到这一点:

select t.*
from ((select *
       FROM admin.acct_activity
       where RANDOM() <=1 and extract(day from page_hit_ts) Between 6 and 10
       limit 500
      )
     UNION all
     (SELECT *
      FROM admin.acct_activity
      where RANDOM() <=1 and extract(day from page_hit_ts) Between 11 and 12
      limit 200
     )
    ) t

【讨论】:

已确认 - 使用括号非常有效,如 Gordon 的***示例所示。谢谢,戈登!【参考方案2】:

每个查询只能设置一个LIMIT 语句。您应该将每个受限查询放入一个临时表中,然后将UNION ALL 放入临时表中。

【讨论】:

以上是关于在 NZSQL 中使用 union all 限制时出错的主要内容,如果未能解决你的问题,请参考以下文章

sql 中union all有啥用法

sql中union all与 limit不能一同使用

使用多个 UNION ALL 构建视图:有更好的方法吗?

具有三个或更多选择的 UNION ALL 的正确语句

union和union all 的写法

sql中用union all最多可以合并几个表