imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 24.09.2007, 14:31     # 1
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Question SQL UPDATE

Задачка такая.

Есть запрос типа
SELECT t1.name, t2.pp FROM t1, t2 WHERE t1.id=t2.id

Этот запрос нужно объединить с апдейтом на таблицу t3. Полю t3.name должно присвоиться значение из выборки (t1.name). Их тогда ещё наверно по дополнительному признаку связать.
Такая хохма вообще возможна?
База - Oracle10.
EvroStandart вне форума  
Старый 24.09.2007, 15:52     # 2
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493

Borland - Гад и сволочь
Справочник по 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
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 24.09.2007, 16:54     # 3
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
За справочник спасибо. Только мне 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


Примерно так. Одним запросом оформить можно?
EvroStandart вне форума  
Старый 24.09.2007, 17:33     # 4
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
А не проще сделать то же самое через 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.
Hubbitus вне форума  
Старый 24.09.2007, 17:43     # 5
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493

Borland - Гад и сволочь
Цитата:
Сообщение от Hubbitus Посмотреть сообщение
никогда не работал с Ораклом, будет ли работать в нем,
Серьёзных различий в синтаксисе запросов с M$ SQL нет. Насколько помню, должно работать.
Только не забывайте ставить ";" в конце Statement...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 24.09.2007, 21:19     # 6
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от Borland Посмотреть сообщение
Серьёзных различий в синтаксисе запросов с M$ SQL нет.
Ну как сказать. В данном запросе может и схоже. А Вообще T-SQL с SQL/PL и рядом не лежал, на сколько я понимаю.
Да, и ';' M$ SQL не требует, если нету следом другой инструкции, тоесть когда оно нужно для явного отделения операторов.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 25.09.2007, 01:20     # 7
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 493

Borland - Гад и сволочь
Цитата:
Сообщение от Hubbitus Посмотреть сообщение
T-SQL с SQL/PL
Оракловый диалект налывается PL/SQL (отнюдь не SQL/PL!!!) - это точно!
А если серьёзно - у каждой СУБД свой собственный диалект SQL, но в основе лежит именно SQL (Structured Query Language), т.е., не вдаваясь в подробности, простой SQL-запрос во всех диалектах работает одинаково...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 25.09.2007, 11:08     # 8
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Цитата:
Сообщение от Hubbitus Посмотреть сообщение
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)
аднака неработает.
И вообще, мне нужно через селект делать. Потом рабочий запрос будет в десять раз сложнее.

У меня получилось так:
UPDATE t3
SET (name, pp) =
(SELECT t1.name, t2.pp
FROM t1, t2
WHERE t1.code = t2.code
AND t3.code = t1.code) ;
EvroStandart вне форума  
Старый 25.09.2007, 12:45     # 9
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Цитата:
Сообщение от Borland Посмотреть сообщение
А если серьёзно - у каждой СУБД свой собственный диалект SQL, но в основе лежит именно SQL (Structured Query Language), т.е., не вдаваясь в подробности, простой SQL-запрос во всех диалектах работает одинаково...
Ну это только так хотчелось бы. В жизни обычно тонкостей хватает

Цитата:
Сообщение от EvroStandart Посмотреть сообщение
аднака неработает.
Borland, вот и пример...

Точно? Что не работает-то? Ошибка парсинга? Не верные результаты обновления??

Цитата:
Сообщение от EvroStandart Посмотреть сообщение
И вообще, мне нужно через селект делать. Потом рабочий запрос будет в десять раз сложнее.
Никто не мешает сделать в моем запросе подзапрос.

Цитата:
Сообщение от EvroStandart Посмотреть сообщение
У меня получилось так:
Ну так понятно - подзапрос на каждую строку тоже вариант. Я думал его не хотелось какраз делать, с точки зрения оптимизации.

В общем, естественно, обычно нужно условие WHERE, я свой пример тоже упростил. В общем у меня был подзапрос, который в свою очередь JOIN'ился с самой обновляемой таблицей. НО, в представленном мной примере, суть какраз будет в том, что происходить объединение множеств JOIN, что при сурогатных коротких ключах и на объемных таблицах будет быстрее чуть ли не на порядок.

добавлено через 3 минуты
Впрочем, если в твоем варианте сделать покрытие индексом для выборки из таблиц что в подзапросе, то скорее всего производительность будет сопоставимой. Но это соответственно накладывает некоторые ограничения (скорее условия) на исходные таблицы.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.
Hubbitus вне форума  
Старый 25.09.2007, 14:05     # 10
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Цитата:
Сообщение от Hubbitus Посмотреть сообщение
Точно? Что не работает-то? Ошибка парсинга? Не верные результаты обновления??
ORA-00933 SQL command not properly ended

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.
EvroStandart вне форума  
Старый 26.09.2007, 01:04     # 11
Hubbitus
мод
IMHO Кодер-200(6,7,8)
 
Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734

Hubbitus Бог с наворотамиHubbitus Бог с наворотами
Hubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотамиHubbitus Бог с наворотами
Хм, ну видимо Оракл тоже не знает конструкции UPDATE ... FROM

Странно вообще-то. Помню столкнулся, долго искал, оказалось очень удобным. В MySQL тоже нету такой поддержки , но это-то какраз не так удивительно.

Видимо фича M$ SQL Server. При всем моем не лучшем отношении к их продуктам.... надо признать очень удобная фича.

По Ораклу, к сожалению, подсказать подробнее не могу.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям!

Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru
Pahan-Hubbitus.

Последний раз редактировалось Hubbitus; 26.09.2007 в 01:07.
Hubbitus вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 23:30.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.