IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   SQL UPDATE (http://www.imho.ws/showthread.php?t=123973)

EvroStandart 24.09.2007 14:31

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

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

Этот запрос нужно объединить с апдейтом на таблицу t3. Полю t3.name должно присвоиться значение из выборки (t1.name). Их тогда ещё наверно по дополнительному признаку связать.
Такая хохма вообще возможна?
База - Oracle10.

Borland 24.09.2007 15:52

Справочник по 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

EvroStandart 24.09.2007 16:54

За справочник спасибо. Только мне 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


Примерно так. Одним запросом оформить можно?

Hubbitus 24.09.2007 17:33

А не проще сделать то же самое через 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)

Не знаю, никогда не работал с Ораклом, будет ли работать в нем, или нет. Попробуйте.

Borland 24.09.2007 17:43

Цитата:

Сообщение от Hubbitus (Сообщение 1462094)
никогда не работал с Ораклом, будет ли работать в нем,

Серьёзных различий в синтаксисе запросов с M$ SQL нет. Насколько помню, должно работать.
Только не забывайте ставить ";" в конце Statement...

Hubbitus 24.09.2007 21:19

Цитата:

Сообщение от Borland (Сообщение 1462097)
Серьёзных различий в синтаксисе запросов с M$ SQL нет.

Ну как сказать. В данном запросе может и схоже. А Вообще T-SQL с SQL/PL и рядом не лежал, на сколько я понимаю.
Да, и ';' M$ SQL не требует, если нету следом другой инструкции, тоесть когда оно нужно для явного отделения операторов.

Borland 25.09.2007 01:20

Цитата:

Сообщение от Hubbitus (Сообщение 1462196)
T-SQL с SQL/PL

Оракловый диалект налывается PL/SQL (отнюдь не SQL/PL!!!) - это точно! ;)
А если серьёзно - у каждой СУБД свой собственный диалект SQL, но в основе лежит именно SQL (Structured Query Language), т.е., не вдаваясь в подробности, простой SQL-запрос во всех диалектах работает одинаково...

EvroStandart 25.09.2007 11:08

Цитата:

Сообщение от Hubbitus (Сообщение 1462094)
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) ;

Hubbitus 25.09.2007 12:45

Цитата:

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

Ну это только так хотчелось бы. В жизни обычно тонкостей хватает :(

Цитата:

Сообщение от EvroStandart (Сообщение 1462316)
аднака неработает.

Borland, вот и пример...

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

Цитата:

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

Никто не мешает сделать в моем запросе подзапрос.

Цитата:

Сообщение от EvroStandart (Сообщение 1462316)
У меня получилось так:

Ну так понятно - подзапрос на каждую строку тоже вариант. Я думал его не хотелось какраз делать, с точки зрения оптимизации.

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

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

EvroStandart 25.09.2007 14:05

Цитата:

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

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.

Hubbitus 26.09.2007 01:04

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

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

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

По Ораклу, к сожалению, подсказать подробнее не могу.


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

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