Более элегантный SQL? - PullRequest
2 голосов
/ 26 мая 2009

Запрос ниже является полностью функциональным и запрашивает одну таблицу, чтобы найти последние 50 имен пользователей, добавленных через последовательный столбец userid.

Логика до сих пор состоит в том, чтобы: выяснить самый высокий идентификатор пользователя; вычтите 50 из этого; тянуть имена пользователей туда, где больше.

Однако он не выглядит элегантно и использует два подзапроса для достижения своей цели:

SELECT username  
FROM table  
WHERE userid IN  
  (SELECT userid  
   FROM table  
   WHERE userid >  
    (SELECT MAX(userid) -50  
     FROM table))

Есть ли способ сделать это менее вложенным? Более эффективным? Более элегантно? Любая помощь будет высоко ценится, так как это не может быть лучшим способом!

Приветствия и большое спасибо
Али

Ответы [ 7 ]

6 голосов
/ 26 мая 2009

Ответы приведены вдоль правильных линий. Вы можете использовать ROWNUM для выбора результатов в стиле TOP-N.

Пожалуйста, будьте осторожны и обратите внимание, что rownum присваивается результатам запроса после предикации, но до ORDER BY. Попробуйте что-то вроде следующего:

SELECT username  
FROM 
  (SELECT username  
   FROM table  
   ORDER BY userid DESC)
WHERE rownum <= 50
2 голосов
/ 26 мая 2009

Вы можете использовать ROW_NUMBER (), чтобы назначить номер каждой строке, основываясь на ее позиции в упорядоченном списке. Например, для нумерации строк, начинающихся с 1, для самого высокого идентификатора пользователя:

SELECT username
FROM (
    SELECT 
         ROW_NUMBER() OVER (ORDER BY user_id DESC) AS RowNr,
         *
    FROM users
) sub
WHERE RowNr < 50

В отличие от запроса в вопросе, это будет работать, если идентификатор пользователя не является последовательным.

2 голосов
/ 26 мая 2009
SELECT * FROM (SELECT UserName FROM Table ORDER BY UserID DESC) 
WHERE RowNum <= 50

... я думаю ... прошло некоторое время с тех пор, как я возился с Oracle.

Это примерно так же, как

SELECT Top 50 в SQLServer

и

SELECT ... LIMIT 50 в MySql

1 голос
/ 26 мая 2009

Чисто для эстетики я использую SQLinForm , который является Java-апплетом, который очень хорошо форматирует ваш SQL. Он также гибкий с множеством опций.

0 голосов
/ 26 мая 2009

Если у вас есть поле DateCreated в пользовательской таблице, вы можете сделать запрос следующим образом:

SELECT TOP 50 username
FROM table 
ORDER BY DateCreated DESC
0 голосов
/ 26 мая 2009

как насчет:

SELECT username FROM table ORDER BY userid DESC LIMIT 50
0 голосов
/ 26 мая 2009

Зависит от базы данных, которую вы используете, но попробуйте что-то вроде этого:

оракул: выберите имя пользователя из таблицы, где rownum <50 order by userid; </p>

PostgreSQL: выберите имя пользователя в табличном порядке по пределу идентификатора пользователя 10;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...