выберите n строк в sql

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть таблица

 Country | Capital
----------------------
France  |  Paris
Germany | Berlin
USA     | Washington
Russia  | Moscow.
  

Мне нужно выбрать все строки, кроме первой.Таблица не имеет первичного ключа.
Как я должен это сделать?

Комментарии:

1. что представляет собой «первую» строку без PK?

2. Даже с PK нет «первой строки», поскольку PK не налагает никакого порядка

Ответ №1:

 SELECT *
FROM (
   SELECT country, capitol, rownum as rn
   FROM your_table
   ORDER BY country
) 
WHERE rn > 1
  

Если «первый» не определен с помощью сортировки по стране, то вам нужно применить другой ORDER BY во внутреннем запросе.

Редактировать

Для полноты картины решением ANSI SQL для этого было бы:

 SELECT *
FROM (
   SELECT country, 
          capitol, 
          row_number() over (order by country) as rn
   FROM your_table
) 
WHERE rn > 1
  

Это портативное решение, которое работает практически со всеми основными СУБД

Ответ №2:

Способ сделать это с помощью Oracle заключается в следующем:

 SELECT country, capital FROM 
       ( SELECT rownum rn, country, capital
           FROM table
       )
 WHERE rn > 1
  

Вы не можете поставить прямое >N условие для rownum, потому что ROWNUMs назначаются при извлечении строк, и ваше условие никогда не будет оценено как TRUE.

Альтернативой является:

 SELECT country, capital FROM table
 MINUS
SELECT country, capital FROM table WHERE rownum <= 1
  

Комментарии:

1. -1 это не имеет смысла. Почему бы просто не извлечь все записи и не отбросить одну из них случайным образом?

2. @Джеффри Кемп: Возможно, это не имеет смысла, но это то, о чем просил OP.