【问题标题】:Why can't I use first in informix subqueries为什么我不能先在 informix 子查询中使用
【发布时间】:2014-05-04 03:49:59
【问题描述】:

为什么我不能在子查询中使用 select first?这里我有一些抛出异常的伪选择:Cannot use 'first', 'limit' or 'skip' in this context.

我不明白为什么。我想选择前 10 个 ID,然后在该集合中的其他表行中选择

select * from Table1 where ID in ( select  first 10  ID from Table2)

我应该如何重写这个选择?

【问题讨论】:

    标签: sql informix


    【解决方案1】:

    它不是很漂亮,但似乎可以工作:

    SELECT * FROM _tmp_table 
    WHERE id IN 
       (SELECT id FROM 
          (SELECT FIRST 10 id FROM _tmp_table)
       )
    

    【讨论】:

    • hm ok 这解决了问题,但是为什么informx db 有这样的限制?
    • 搞笑的是select (select first 1 from sysmaster:sysdual) from sysmaster:sysdual是不允许的,但是select (select x from ( select first 1 x from sysmaster:sysdual) ) from sysmaster:sysdual是允许的。这基本上是相同的上下文。
    【解决方案2】:

    因为它是这样设计的...
    我相信 IBM Informix 工程师对此有一些技术限制,因为这是来自许多 Informix 用户的旧功能请求......(尽管IBM RFE 站点上没有关于此的 RFE)

    如果你查看Informix Manuals you will found the answer quoted here:

    Projection 子句不能包含 SKIP、FIRST 或 LIMIT 这些上下文中的关键字:

    • 当 SELECT 语句是视图定义的一部分时
    • 在子查询中,外部查询的 FROM 子句除外
    • 在参与的数据库服务器不支持 SKIP、FIRST 或 LIMIT 关键字的跨服务器分布式查询中。

    就像@Michael 的回答一样,只是一个清晰的例子…… 这在版本 11.70 中。

    $ dbaccess -e sysmaster x.sql
    
    Database selected.
    
    
    select first 10 tabname[1,20] from systables
    ;
    
    tabname
    
    systables
    syscolumns
    sysindices
    systabauth
    syscolauth
    sysviews
    sysusers
    sysdepend
    syssynonyms
    syssyntable
    
    10 row(s) retrieved.
    
    
    select t.tabname[1,20] from (select first 2 * from systables) as  t
    
    
    tabname
    
    systables
    syscolumns
    
    2 row(s) retrieved.
    
    
    Database closed.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多