2014-03-26 3 views
4

Почему я не могу использовать select сначала в подзапросе? Здесь у меня есть псевдовыбор, который выдает исключение: Cannot use 'first', 'limit' or 'skip' in this context.Почему я не могу использовать сначала в подзапросах informix

Я не понимаю, почему. Я хочу, чтобы выбрать первые 10 идентификаторов, а затем и в других строках таблицы, которые в этом наборе

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

Как я должен переписать этот выбор?

ответ

7

Это не очень красиво, но, кажется, работает:

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

hm ok Это решение проблемы, но почему существует такое ограничение в informx db? – hudi

+1

Это смешно 'select (выберите сначала 1 из sysmaster: sysdual) из sysmaster: sysdual' не разрешен, но' select (выберите x из (выберите сначала 1 x из sysmaster: sysdual)) из sysmaster: sysdual' разрешен. Это в основном тот же контекст. – nurettin

5

Потому что дизайн так ...
Я считаю, что инженеры IBM Informix имеют некоторые технические ограничения для этого, потому что это запрос старой функции от большого количества пользователей Informix ... (несмотря на то что нет RFE об этом на сайте IBM RFE)

Если вы проверяете Informix Manuals you will found the answer quoted here:

Предложение Проекции не может включать в себя SKIP, ПЕРВОЕ, или LIMIT ключевых слов в этих контекстах:

  • когда ЗЕЬЕСТ является частью определения вида
  • в подзапросе, за исключение в ЕКЕ внешний запрос
  • в межсерверном распределенном запросе, в котором участвующий сервер базы данных не поддерживает ключевые слова 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. 
Смежные вопросы