#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.