2015-03-14 2 views
1
SELECT name 
FROM EMPLOYEE o 
WHERE 
    (SELECT count(*) 
    FROM EMPLOYEE i 
    WHERE i.name < o.name) < 5 

Это дает 5 лучших записей из таблицы. Пожалуйста, объясните, как.Пожалуйста, объясните этот вложенный запрос

+2

Почему? Есть более эффективные способы реализации этой логики. –

+0

Вы используете Менее оператора для сравнения поля имени? Можете ли вы объяснить, что именно вы хотите в качестве результата? –

+0

Для меня это хороший запрос, чтобы улучшить концепцию базы данных. –

ответ

1

После того, как вы понимаете, таблицы псевдонимов, ваш запрос становится очевидно:

SELECT name 
FROM EMPLOYEE o  -- <<== Alias #1 
WHERE (
    SELECT count(*) 
    FROM EMPLOYEE i -- <<== Alias #2 
    WHERE i.name < o.name) < 5 

Ваш запрос определяет два псевдонима для одной и той же EMPLOYEE таблицы.

В запросе внутри подсчитывается количество имен сотрудников i (внутренний) «впереди» сотрудника o (внешний). Если количество имен сотрудников перед текущим значением меньше пяти, имя возвращается как результат запроса.

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

+0

Ну, счетчик (*) выдает число, скажем, 10, поэтому оно становится «где 10 <5». Итак, как этот запрос действительно работает? –

+0

@RahulDwivedi 'COUNT (*)' будет давать разные номера для каждой строки 'EMPLOYEE'. Для строк с именами в верхней части списка они будут содержать числа 0, 1, 2, 3 и 4, поэтому count <5 будет true. Для остальных строк счетчик будет выше 5, поэтому count <5 будет false, и строка не будет выбрана. – dasblinkenlight

+0

Давайте рассмотрим это на примере. Допустим, эти имена в ЕМРЬОУЕМ: имени Das Blink Enlight Рахул Dwivedi ABC XYZ Теперь скажите мне, как это сравнение происходит в «i.name

1

Этот запрос не имеет смысла и не выбирает «верхние 5 записей»; он выберет все строки, которые будут квалифицироваться в соответствии с коррелированным подзапросом.

Подзапрос коррелирован с ссылкой на внешнюю таблицу. Для каждой строки в таблице подзапрос подсчитывает количество сотрудников с наименьшим именем, чем внешняя ссылка. Предикат «менее 5» применяется к полученному счету для каждой строки внешней таблицы. Внешняя строка возвращается только в том случае, если в ней меньше 5 сотрудников с наименьшим именем, чем текущее имя.

Если у вас есть таблица с 4 строками с именем «Джейн» и 100 строк с именем «Джон», вы получите все 100 строк «Джон», потому что подзапрос вернет 0 для каждой строки «Джейн» и 4 для каждой строки «Джон».