Вопрос:
Я растерялся, почему это не может быть
Select x.continent, x.name From world x Where x.name <= ALL (select y.name from world y where x.name=y.name) ORDER BY name
Может кто-нибудь объяснить мне, почему он должен быть x.continent = y.continent, а не x.name = y.name?
Таблица
Лучший ответ:
когда вы используете x.name=y.name вы сравниваете имя страны из x с именем страны из y, если оба экземпляра имеют одно и то же имя страны. Это в основном просто вернет вам полную таблицу x.
Вы хотите использовать x.continent=y.continent потому что вы хотите сравнить имя страны экземпляра от x с именем страны экземпляра от y, если они имеют один и тот же континент.
Позвольте мне проиллюстрировать это шаг за шагом на примере: Здесь у нас есть табличный мир, и я заполнил некоторые данные:
world: Select x.continent, x.name From world x ORDER BY name continent name Asia Afghanistan Europe Albania Africa Algeria Europe Andorra Africa Angola SouthAmerica Bolivia SouthAmerica Brazil Europe Hungary Asia Japan Africa Nigeria SouthAmerica Peru Asia Taiwan
когда вы выполняете этот запрос без предложения WHERE в вашем подзапросе:
Select x.continent, x.name From world x Where x.name <= ALL (select y.name from world y) ORDER BY name
вы получаете это
continent name Asia Afghanistan
Это связано с тем, что предложение where отфильтровывало все, кроме одной страны
where x.name <= (Afghanistan,Taiwan,Japan, Albania,Hungary,Algeria,Nigeria,Andorra, Angola,Bolivia,Peru,Brazil)
а именно, название страны, которое на первом месте по алфавиту, что является Афганистаном.
но поскольку мы хотим получить первую страну на каждом континенте, мы добавим x.continent=y.continent к нашему подзапросу
Select x.continent, x.name From world x Where x.name <= ALL (select y.name from world y where x.continent=y.continent) ORDER BY name
то, что происходит внизу, заключается в том, что теперь мы сравниваем только название страны из x с именем страны экземпляра из y, если они имеют один и тот же континент. Поэтому используйте азиатский континент, например:
Япен отфильтровывается, потому что Japan <= All(Afghanistan,Taiwan,Japan) ошибочна, поскольку Japan <= All(Afghanistan,Taiwan,Japan) не меньше или равно Афганистану (А доходит до J)
Тайвань отфильтровывается, потому что Taiwan <= All(Afghanistan,Taiwan,Japan) является ложным, поскольку Тайвань не менее или равен Афганистану.
Афганистан не отфильтровывается, потому что Afghanistan <= All(Afghanistan,Taiwan,Japan) верен, поскольку Афганистан равен Афганистану
Однако, если вы используете x.name=y.name в своем подзапросе, тогда вы по существу сравниваете каждую страну с самим собой, и все они будут включены в ваш окончательный результат, потому что все имя страны равно самому имени страны.
Я надеюсь, что эта помощь и приветствуем Stack Overflow. Если этот ответ или любой другой решают вашу проблему, отметьте его как принятый “.