Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
Dima_XXX
Member

Откуда:
Сообщений: 25
Возможно ли, используя join таблиц, удалить данные из таблицы?
Или как удалить данные из таблицы (не использую in clause) , по результатам запросов из других таблиц. Всего таблиц, из которых берутся данные около 5.

Спасибо.
16 авг 07, 00:27    [4532053]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Dima_XXX
не использую in clause
И чем же так IN провинился?
16 авг 07, 00:38    [4532060]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Dima_XXX
Возможно ли, используя join таблиц, удалить данные из таблицы?
Или как удалить данные из таблицы (не использую in clause) , по результатам запросов из других таблиц. Всего таблиц, из которых берутся данные около 5.

Спасибо.

Если только через джойн, то никак не получится. Удаляйте тогда последовательно.
16 авг 07, 00:42    [4532061]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
xymbo
Dima_XXX
Возможно ли, используя join таблиц, удалить данные из таблицы?
Или как удалить данные из таблицы (не использую in clause) , по результатам запросов из других таблиц. Всего таблиц, из которых берутся данные около 5.

Спасибо.

Если только через джойн, то никак не получится. Удаляйте тогда последовательно.


та да... лови, короче...

SQL> CREATE TABLE test1 AS (SELECT LEVEL ID FROM DUAL CONNECT BY LEVEL <5);
 
Table created
SQL> CREATE TABLE test2 AS (
  2    SELECT ID FROM TEST1 WHERE ID > 2
  3    UNION ALL
  4    SELECT ID + 10 FROM TEST1 WHERE ID > 2
  5  );
 
Table created
SQL> ALTER TABLE TEST1 ADD PRIMARY KEY (ID);
 
Table altered
SQL> ALTER TABLE TEST2 ADD PRIMARY KEY (ID);
 
Table altered
SQL> SELECT * FROM TEST1;
 
        ID
----------
         1
         2
         3
         4
SQL> SELECT * FROM TEST2;
 
        ID
----------
         3
         4
        13
        14
SQL> DELETE (SELECT * FROM TEST1, TEST2 WHERE TEST1.ID = TEST2.ID);
 
2 rows deleted
SQL> SELECT * FROM TEST1;
 
        ID
----------
         1
         2
SQL> SELECT * FROM TEST2;
 
        ID
----------
         3
         4
        13
        14
 
SQL> 

Сам правда, такие непотредства не пользую, да и синтаксис DELETE, в части ONLY - ниасилил... ;((
16 авг 07, 01:37    [4532092]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
Dima_XXX
Возможно ли, используя join таблиц, удалить данные из таблицы?
Или как удалить данные из таблицы (не использую in clause) , по результатам запросов из других таблиц. Всего таблиц, из которых берутся данные около 5.

Спасибо.


Oracle умеет самостоятельно удалять из вьюх и запросов. Кури доку на предмет key preserved (хрен чего то там).

А вообще... Я б не советовал. Подобные "хвичи", чёт мне кажется, самими первожрецами Оракула и прочими небожителями тестируются как бы через пень колоду (с содроганием вспоминая чудеса MERGE по обзорам).

...

Лирика: а был бы я админом, или манагером техническим - прибил бы тебя за такое. Ты че - этож думать надо, че это ты такое понаписал, ну не думать, в мануал полезть, а это крутым перцам - ну никак не с руки ;)
16 авг 07, 01:44    [4532094]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
Если позволяет версия Oracle (10g либо старше), такое удаление можно выполнить при помощи MERGE.
Но опять-таки: а с чем связан запрет на использование IN?
16 авг 07, 01:51    [4532096]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
Dima_XXX
Member

Откуда:
Сообщений: 25
Спасибо за ответы:)

Проблема в том, что начальство хочет, чтобы насколько можно улучшить производительность.
Обычный запрос на удаление с in clause выполнятся несколько минут (слишком много данных). А из практики знаю, что in работает медленнее чем просто join tables.
Oracle 10g.2
16 авг 07, 02:04    [4532103]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
miksoft
Member

Откуда:
Сообщений: 38540
Dima_XXX
Проблема в том, что начальство хочет, чтобы насколько можно улучшить производительность.
Когда-то пробегал по этому форуму вот такой вариант:
DELETE FROM table1 WHERE table1.rowid IN (SELECT table1.rowid FROM table1, ... WHERE ...)

Dima_XXX
А из практики знаю, что in работает медленнее чем просто join tables.
Имхо, это спорно, но настаивать не буду.
16 авг 07, 02:25    [4532111]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
grexhide
xymbo
Dima_XXX
Возможно ли, используя join таблиц, удалить данные из таблицы?
Или как удалить данные из таблицы (не использую in clause) , по результатам запросов из других таблиц. Всего таблиц, из которых берутся данные около 5.

Спасибо.

Если только через джойн, то никак не получится. Удаляйте тогда последовательно.


та да... лови, короче...

SQL> CREATE TABLE test1 AS (SELECT LEVEL ID FROM DUAL CONNECT BY LEVEL <5);
 
Table created
SQL> CREATE TABLE test2 AS (
  2    SELECT ID FROM TEST1 WHERE ID > 2
  3    UNION ALL
  4    SELECT ID + 10 FROM TEST1 WHERE ID > 2
  5  );
 
Table created
SQL> ALTER TABLE TEST1 ADD PRIMARY KEY (ID);
 
Table altered
SQL> ALTER TABLE TEST2 ADD PRIMARY KEY (ID);
 
Table altered
SQL> SELECT * FROM TEST1;
 
        ID
----------
         1
         2
         3
         4
SQL> SELECT * FROM TEST2;
 
        ID
----------
         3
         4
        13
        14
SQL> DELETE (SELECT * FROM TEST1, TEST2 WHERE TEST1.ID = TEST2.ID);
 
2 rows deleted
SQL> SELECT * FROM TEST1;
 
        ID
----------
         1
         2
SQL> SELECT * FROM TEST2;
 
        ID
----------
         3
         4
        13
        14
 
SQL> 

Сам правда, такие непотредства не пользую, да и синтаксис DELETE, в части ONLY - ниасилил... ;((

grexhide, я подразумевал, что нельзя одновременно удалить например из двух таблиц по джойну, в твоем примере как раз удалились строки только из первой таблицы, а из второй нет.
16 авг 07, 08:50    [4532323]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
xymbo


А разве ему не это требовалось?

Сам я категорически за форму удаления по rowid, тем более, разницы в производительности - не будет никакой (и как то более надежно, что ли, уж больно неубедителен синтаксис удаления из key preserverd joined subqyery).

...

По поводу удаления из двух таблиц сразу (через какой хитрый MERGE или синтаксис DELETE).. наверное все же такая возможность есть (не через instead of), но... практически мне это не нужно, хотя, конечно же интересно (с удивлением я не нагуглил вообще ничего на пример использования даже WITH READ ONLY в DELETE, чему, признаться, был зело удивлён).
16 авг 07, 09:02    [4532357]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
grexhide
xymbo


А разве ему не это требовалось?

Сам я категорически за форму удаления по rowid, тем более, разницы в производительности - не будет никакой (и как то более надежно, что ли, уж больно неубедителен синтаксис удаления из key preserverd joined subqyery).

...

По поводу удаления из двух таблиц сразу (через какой хитрый MERGE или синтаксис DELETE).. наверное все же такая возможность есть (не через instead of), но... практически мне это не нужно, хотя, конечно же интересно (с удивлением я не нагуглил вообще ничего на пример использования даже WITH READ ONLY в DELETE, чему, признаться, был зело удивлён).

Перечитал еще раз, и понял, что это и надо было, прими извинения.Я чет подумал об удалении данных одновременно из двух таблиц.И не мог этому поверить, также как и ты, что такое возможно, но был бы очнь благодарен, если бы кто-то показал бы такой синтаксис.
16 авг 07, 09:10    [4532395]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
Dima_XXX
Проблема в том, что начальство хочет, чтобы насколько можно улучшить производительность.
Обычный запрос на удаление с in clause выполнятся несколько минут (слишком много данных). А из практики знаю, что in работает медленнее чем просто join tables.
Oracle 10g.2
посмотрите в сторону EXISTS, в зависимости от конкретной ситуации у Вас, - может быть получше, чем IN.
16 авг 07, 10:02    [4532710]     Ответить | Цитировать Сообщить модератору
 Re: Как удалить данные из одной таблицы используя результаты из других таблиц.  [new]
Dima_XXX
Member

Откуда:
Сообщений: 25
Всем огромное спасибо. Есть теперь над чем поработать. :)
16 авг 07, 17:28    [4536737]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить