#sql #subquery
#sql #подзапрос
Вопрос:
У меня есть этот запрос, в котором есть подзапрос в предложении FROM
SELECT x, y
FROM FOO
WHERE y IN (SELECT y
FROM
(SELECT y, z, MIN(v)
FROM BAR
GROUP BY y, z))
Профессор, преподающий класс, сказал, что не все базы данных поддерживают его, и я должен использовать только подзапросы в WHERE
предложении.
Я пытаюсь преобразовать приведенный выше запрос, чтобы не использовать подзапрос в FROM
предложении, но не могу понять это.
Есть идеи?
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты. Неясно, что вы хотите сделать.
2. Не все базы данных ?!? В 2020 году все делают.
3. Но вам это не нужно.
Ответ №1:
Это отвечает на исходную версию вопроса.
Все базы данных поддерживают подзапросы в FROM
предложении.
Как написано, агрегирование совершенно не нужно. Вы сравниваете y
значения. Вычисление on v
не имеет значения. Итак, вы могли бы также написать:
SELECT x, y
FROM FOO
WHERE y in (SELECT y FROM BAR)
Комментарии:
1. Отредактировал вопрос — теперь, я думаю, необходима агрегация
2. Я думаю, что Гордон по-прежнему прав, поскольку обработка для
WHERE y in (some list of y values)
используется только для определения, действительно ли y существует в BAR . Поэтому вам не нужны остальные (z, MIN(v), group by ). Чтобы проверить это, пожалуйста, попробуйте найти любой набор данных, где это будет иметь значение.
Ответ №2:
Вы можете сделать, как показано ниже —
Select distinct FOO.x,FOO.y
FROM FOO
JOIN ( SELECT y,z, min(v) FROM BAR groupby y,z) TAB
ON FOO.y = TAB.y;
Я согласен с другим комментарием Гордона о том, что агрегирование совершенно не нужно. Тем не менее, я придерживался того, что вы пробовали в моем ответе, и по-прежнему давал правильные результаты, устраняя дополнительный подзапрос с помощью Join .
Ответ №3:
Во-первых, подзапрос:
SELECT y FROM ( SELECT y,z min(v) FROM BAR groupby y,z)
помимо пропущенной запятой после z
и пробела между group
и by
, эквивалентно:
SELECT y from (SELECT DISTINCT y, z FROM BAR) sq1
что эквивалентно:
SELECT y from (SELECT DISTINCT y FROM BAR) sq1
что эквивалентно:
SELECT DISTINCT y FROM BAR
Итак:
SELECT x, y
FROM FOO
WHERE y in (
SELECT DISTINCT y FROM BAR
)