Могу ли я сделать что-то подобное в базе данных оракула?
Ну, это не о том, можете ли вы это сделать или нет. Речь идет о том, нужно ли вам это делать или нет. В вашем запросе я не вижу никаких критериев фильтрации. Вы хотите обновить все строки? Я не вижу необходимости в CTE в вашем случае.
Когда вам понадобится CTE, то есть предложение a как метод факторизации подзапроса, когда у вас есть сценарий, когда подзапрос выполняется несколько раз. Вы используете предложение WITH, чтобы убедиться, что подзапрос выполняется один раз, а результирующий набор хранится как временная таблица.
Да, вы можете использовать С пунктом для UPDATE заявления.
Например,
UPDATE TABLE t
SET t.column1, t.column2 = (SELECT column1, column2 FROM
(
WITH cte AS(
SELECT ... FROM another_table
)
SELECT * FROM cte
)
Вы можете использовать MERGE заявление ИСПОЛЬЗОВАНИЕС пункта.
Например,
SQL> MERGE INTO emp e USING
2 (WITH average AS
3 (SELECT deptno, AVG(sal) avg_sal FROM emp group by deptno)
4 SELECT * FROM average
5 ) u
6 ON (e.deptno = u.deptno)
7 WHEN MATCHED THEN
8 UPDATE SET e.sal =
9 CASE
10 WHEN e.sal <= u.avg_sal
11 THEN e.sal * 1.05
12 ELSE e.sal * 1.03
13 END
14/
14 rows merged.
SQL>
У меня нет большого опыта работы с базой данных Oracle, но я думаю, что вы получаете сообщение об ошибке, потому что вы хотите использовать CTE (который возвращает результаты в форме таблицы) внутри обновления. Почему бы вам просто не сохранить результат «SELECT avg (зарплата) FROM trainer' в переменную и использовать ее в UPDATE? Я думаю, что это самый простой способ сделать то, что вы хотите. –
Хорошо, я сделаю это. Но у меня есть вопрос, мы можем использовать вместе и обновлять предложение вместе? – shashankgaurav
Как я уже сказал, [CTE] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL#Common_table_expression) возвращает результаты в форме таблицы, а затем вы можете использовать их через JOINs с другими таблицами или использовать в другими способами (но не так, как вы его используете), чтобы получить нужные результаты.Итак, чтобы ответить на ваш вопрос: Нет, вы не можете использовать CTE (он не называется «с») таким образом, как ваш. –