imho.ws |
![]() |
![]() |
![]() |
# 1 |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Задачка такая.
Есть запрос типа SELECT t1.name, t2.pp FROM t1, t2 WHERE t1.id=t2.id Этот запрос нужно объединить с апдейтом на таблицу t3. Полю t3.name должно присвоиться значение из выборки (t1.name). Их тогда ещё наверно по дополнительному признаку связать. Такая хохма вообще возможна? База - Oracle10. |
![]() |
![]() |
# 2 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493
![]() |
Справочник по 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
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
![]() |
![]() |
# 3 |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
За справочник спасибо. Только мне 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 Примерно так. Одним запросом оформить можно? |
![]() |
![]() |
# 4 |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
А не проще сделать то же самое через 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) Не знаю, никогда не работал с Ораклом, будет ли работать в нем, или нет. Попробуйте.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
![]() |
![]() |
# 5 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493
![]() |
Серьёзных различий в синтаксисе запросов с M$ SQL нет. Насколько помню, должно работать.
Только не забывайте ставить ";" в конце Statement...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
![]() |
![]() |
# 6 |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ну как сказать. В данном запросе может и схоже. А Вообще T-SQL с SQL/PL и рядом не лежал, на сколько я понимаю.
Да, и ';' M$ SQL не требует, если нету следом другой инструкции, тоесть когда оно нужно для явного отделения операторов.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
![]() |
![]() |
# 7 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493
![]() |
Оракловый диалект налывается PL/SQL (отнюдь не SQL/PL!!!) - это точно!
![]() А если серьёзно - у каждой СУБД свой собственный диалект SQL, но в основе лежит именно SQL (Structured Query Language), т.е., не вдаваясь в подробности, простой SQL-запрос во всех диалектах работает одинаково...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
![]() |
![]() |
# 8 | |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
И вообще, мне нужно через селект делать. Потом рабочий запрос будет в десять раз сложнее. У меня получилось так: UPDATE t3 SET (name, pp) = (SELECT t1.name, t2.pp FROM t1, t2 WHERE t1.code = t2.code AND t3.code = t1.code) ; |
|
![]() |
![]() |
# 9 | ||
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
![]() Borland, вот и пример... Точно? Что не работает-то? Ошибка парсинга? Не верные результаты обновления?? Цитата:
Ну так понятно - подзапрос на каждую строку тоже вариант. Я думал его не хотелось какраз делать, с точки зрения оптимизации. В общем, естественно, обычно нужно условие WHERE, я свой пример тоже упростил. В общем у меня был подзапрос, который в свою очередь JOIN'ился с самой обновляемой таблицей. НО, в представленном мной примере, суть какраз будет в том, что происходить объединение множеств JOIN, что при сурогатных коротких ключах и на объемных таблицах будет быстрее чуть ли не на порядок. добавлено через 3 минуты Впрочем, если в твоем варианте сделать покрытие индексом для выборки из таблиц что в подзапросе, то скорее всего производительность будет сопоставимой. Но это соответственно накладывает некоторые ограничения (скорее условия) на исходные таблицы.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
||
![]() |
![]() |
# 10 | |
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
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. |
|
![]() |
![]() |
# 11 |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Хм, ну видимо Оракл тоже не знает конструкции UPDATE ... FROM
Странно вообще-то. Помню столкнулся, долго искал, оказалось очень удобным. В MySQL тоже нету такой поддержки ![]() Видимо фича M$ SQL Server. При всем моем не лучшем отношении к их продуктам.... надо признать очень удобная фича. По Ораклу, к сожалению, подсказать подробнее не могу.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. Последний раз редактировалось Hubbitus; 26.09.2007 в 01:07. |
![]() |