![]() |
SQL UPDATE
Задачка такая.
Есть запрос типа SELECT t1.name, t2.pp FROM t1, t2 WHERE t1.id=t2.id Этот запрос нужно объединить с апдейтом на таблицу t3. Полю t3.name должно присвоиться значение из выборки (t1.name). Их тогда ещё наверно по дополнительному признаку связать. Такая хохма вообще возможна? База - Oracle10. |
Справочник по O10: _http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/toc.htm
Конкретно по Select: _http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_10002.htm#i2066346 |
За справочник спасибо. Только мне UPDATE нужен. Причём непонятно как вообще запрос составить. Может так сделать вообще невозможно.
добавлено через 19 минут Пример: Таблица t1: id name code Таблица t2: id pp code Таблица t3: id name pp code Начальные данные: t1: 1 user1 01 2 user2 02 3 user3 03 t2: 1 data1 01 2 data2 02 3 data3 03 t3: 5 xx xx 01 6 xx xx 02 7 xx xx 03 После запроса должно получиться: t3: 5 user1 data1 01 6 user2 data2 02 7 user3 data3 03 Примерно так. Одним запросом оформить можно? |
А не проще сделать то же самое через INSERT, удалив сназача из 3 таблицы все? (REPLACE возможно сразу).
Если нет, я в MS SQL Server делал так: UPDATE t3 SET t3.name = t1.name , t3.pp = t2.pp FROM t1 INNER JOIN t2 ON (t1.id=t2.id) INNER JOIN t3 ON (t3.id = t2.id) Не знаю, никогда не работал с Ораклом, будет ли работать в нем, или нет. Попробуйте. |
Цитата:
Только не забывайте ставить ";" в конце Statement... |
Цитата:
Да, и ';' M$ SQL не требует, если нету следом другой инструкции, тоесть когда оно нужно для явного отделения операторов. |
Цитата:
А если серьёзно - у каждой СУБД свой собственный диалект SQL, но в основе лежит именно SQL (Structured Query Language), т.е., не вдаваясь в подробности, простой SQL-запрос во всех диалектах работает одинаково... |
Цитата:
И вообще, мне нужно через селект делать. Потом рабочий запрос будет в десять раз сложнее. У меня получилось так: UPDATE t3 SET (name, pp) = (SELECT t1.name, t2.pp FROM t1, t2 WHERE t1.code = t2.code AND t3.code = t1.code) ; |
Цитата:
Цитата:
Точно? Что не работает-то? Ошибка парсинга? Не верные результаты обновления?? Цитата:
Цитата:
В общем, естественно, обычно нужно условие WHERE, я свой пример тоже упростил. В общем у меня был подзапрос, который в свою очередь JOIN'ился с самой обновляемой таблицей. НО, в представленном мной примере, суть какраз будет в том, что происходить объединение множеств JOIN, что при сурогатных коротких ключах и на объемных таблицах будет быстрее чуть ли не на порядок. добавлено через 3 минуты Впрочем, если в твоем варианте сделать покрытие индексом для выборки из таблиц что в подзапросе, то скорее всего производительность будет сопоставимой. Но это соответственно накладывает некоторые ограничения (скорее условия) на исходные таблицы. |
Цитата:
Cause: The SQL statement ends with an inappropriate clause. For example, an ORDER BY clause may have been included in a CREATE VIEW or INSERT statement. ORDER BY cannot be used to create an ordered view or to insert in a certain order. Action: Correct the syntax by removing the inappropriate clauses. It may be possible to duplicate the removed clause with another SQL statement. For example, to order the rows of a view, do so when querying the view and not when creating it. This error can also occur in SQL*Forms applications if a continuation line is indented. Check for indented lines and delete these spaces. |
Хм, ну видимо Оракл тоже не знает конструкции UPDATE ... FROM
Странно вообще-то. Помню столкнулся, долго искал, оказалось очень удобным. В MySQL тоже нету такой поддержки :( , но это-то какраз не так удивительно. Видимо фича M$ SQL Server. При всем моем не лучшем отношении к их продуктам.... надо признать очень удобная фича. По Ораклу, к сожалению, подсказать подробнее не могу. |
Часовой пояс GMT +4, время: 08:26. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.