MySQL эквивалент WITH в oracle

Существует ли эквивалент MySQL предложения WITH в Oracle?

12 голосов | спросил Neeru Sharma 10 J000000Wednesday13 2013, 13:45:55

1 ответ


15

Нет. Если (до тех пор) он не развивается (MySQL является открытым исходным кодом, любой может внести свой вклад.)

Ключевое слово ANSI /ISO SQL WITH используется для определения общих выражений таблицы (CTE) и упрощает сложные запросы с помощью одного или нескольких вложенные ссылки. Он доступен в Oracle, Postgres, SQL-Server, DB2, но не в MySQL.

Окончательный запрос может иметь ссылки (обычно в разделе FROM, но они могут быть в любой другой части) любому из общих табличные выражения, один или несколько раз. Запрос может быть записан (без CTE) в MySQL с использованием производных таблиц, но ссылки должны быть сделаны повторно.

Пример глупого запроса, показывающего всех лиц, родившихся в 50-х годах и в июле месяце, и числа всех лиц, родившихся в том же году:

WITH a AS
    ( SELECT name, birthdate, YEAR(birthdate) AS birthyear
      FROM persons
      WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01' 
    ) 
, b AS
    ( SELECT birthyear, COUNT(*) AS cnt
      FROM a
      GROUP BY birthyear 
    ) 
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
  ON a.birthyear = b.birthyear 
WHERE MONTH(a.birthdate) = 7 ;

В MySQL он может быть записан как:

SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM 
    ( SELECT name, birthdate, YEAR(birthdate) AS birthyear
      FROM persons
      WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01' 
    ) AS a 
  JOIN 
    ( SELECT birthyear, COUNT(*) AS cnt
      FROM 
        ( SELECT name, birthdate, YEAR(birthdate) AS birthyear
          FROM persons
          WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01' 
        ) AS aa
      GROUP BY birthyear
    ) AS b
  ON a.birthyear = b.birthyear 
WHERE MONTH(a.birthdate) = 7 ;

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

ответил ypercubeᵀᴹ 10 J000000Wednesday13 2013, 15:07:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132