Альтернатива для подзапроса в предложении FROM

#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
)