2013-11-28 4 views
0

я только что нашел этот кусок кода SQL, который возвращает строку, содержащую самый старый человек: Предположим, что у вас есть таблица persons SQL с двумя столбцами, name и age:Почему этот код SQL возвращает максимальное значение?

SELECT p1.name, p1.age 
FROM persons p1 
LEFT JOIN persons p2 ON p1.age < p2.age 
WHERE p2.age IS NULL 

Почему это возвращающих максимум ? Хотя я думаю, что знаю, что делает левое соединение, я не получаю этот пример, потому что он дважды использует одну и ту же таблицу.

Может кто-нибудь объяснить, что здесь происходит? Я действительно хочу это узнать.

ответ

1

Левое объединение ограничивает возвращаемые значения только строками, где возраст в p2 больше, чем возраст в p1, то предложение WHERE указывает, что только возвратные строки, где p2.age IS NULL, может быть только один va lue в p1, который не имеет значения в p2, что выше; самое высокое значение (учитывая, что таблицы представляют собой одни и те же данные, максимальное значение не может иметь более высокое значение).

Изменение соединения должно быть p1.age > p2.age вернет самый низкий возраст.

EDIT - альтернативное решение

Я думаю, что может быть более эффективным способом, чтобы получить тот же результат будет:

SELECT p1.Name, p1.Age 
FROM persons p1 
INNER JOIN (
    SELECT max(p2.age) As MaxAge FROM persons p2) As q ON (p1.age = q.MaxAge) 

Или, может быть,

SELECT p1.Name, p1.Age 
FROM persons p1 
WHERE p1.age = (SELECT max(p2.age) As MaxAge FROM persons p2) 

Не мастер SQL так могут быть лучшие способы, от беглого взгляда на планы выполнения, которые они (две альтернативы выше) выглядят так, как будто они делают то же самое, но я работаю с небольшим количеством данных.

0

Примечание: это очень неэффективный код. В основном это создает специальный набор записей ВЫБРАТЬ p1.name, p1.age от лиц p1 LEFT JOIN человек p2 ON p1.age < p2.age

для каждого p1, он будет показывать все p2 s, которые старше.

Когда вы добавляете

WHERE p2.age IS NULL 

Он покажет p1, где нет никого, кто старше.

** Side один на эффективность **

Проблема с что

FROM persons p1 
LEFT JOIN persons p2 ON p1.age < p2.age 

создает специальный набор записей, который 1/2 (число лиц)^2

+0

Да, это так. Но как называется этот трюк SQL? – cha

+0

Вы ищете формальное имя, например, «декартовое соединение»? –

Смежные вопросы