Вывести запросы, совместимые с oracle - PullRequest
0 голосов
/ 22 февраля 2020

Как вывести эти запросы, совместимые с Oracle. Не могли бы вы подсказать, как все эти запросы записать в один запрос.

delete from need_status_history   
JOIN need_entl ON  need_status_history.need_entl_puid= need_entl.need_entl_puid    
where need_entl.user_guid=x;


delete  from need_entl_order_history    
JOIN need_entl ON need_entl_order_history.need_entl_puid = need_entl.need_entl_puid    
where need_entl.user_guid=x;


delete from need_entl_notif_history    
JOIN need_entl ON need_entl_notif_history.need_entl_puid=need_entl.need_entl_puid
where need_entl.user_guid=x;


delete from need_entl where user_guid= x;

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вот как это происходит.

В Oracle вы не можете использовать такой синтаксис (кроме последнего delete, который вы написали). Самый простой и, вероятно, самый простой запрос будет выглядеть примерно так:

delete from need_status_history h
where h.need_entl_puid in (select e.need_entl_puid
                           from need_entl e
                           where e.user_guid = 'x'
                          );

Как вы думаете, использовать один запрос для 4 удалений - ну, этого тоже не произойдет. Нет, если вы не поместите все из них в хранимую процедуру (или анонимный блок PL / SQL) и не запустите ее как таковую.


Судя по вашему комментарию, кажется, вы не совсем верите о чем я говорю - вот пример:

Примеры таблиц:

SQL> create table need_status_history (need_entl_puid number);

Table created.

SQL> create table need_entl (user_guid varchar2(10), need_entl_puid number);

Table created.

Ваш запрос:

SQL> delete from need_status_history
  2  JOIN need_entl ON  need_status_history.need_entl_puid= need_entl.need_entl_puid
  3  where need_entl.user_guid='x';
JOIN need_entl ON  need_status_history.need_entl_puid= need_entl.need_entl_puid
*
ERROR at line 2:
ORA-00933: SQL command not properly ended

Рекомендуемый запрос:

SQL> delete from need_status_history h
  2  where h.need_entl_puid in (select e.need_entl_puid
  3                             from need_entl e
  4                             where e.user_guid = 'x'
  5                            );

0 rows deleted.

SQL>

Будучи убеждены

0 голосов
/ 23 февраля 2020

Вы можете сделать все это одним оператором DELETE, но сначала вам нужно будет написать несколько других операторов. : -)

Похоже, что все ваши таблицы связаны с NEED_ENTL полем NEED_ENTL_PUID. Я предполагаю, что в таблице NEED_ENTL поле NEED_ENTL_PUID является либо первичным ключом, либо уникальным ключом. Что вы должны сделать, это установить ограничения внешнего ключа для каждой из ваших вложенных таблиц, которые ссылаются на таблицу NEED_ENTL, чтобы при удалении строки из NEED_ENTL все строки в вложенных таблицах (NEED_STATUS_HISTORY NEED_ENTL_ORDER_HISTORY и NEED_ENTL_NOTIF_HISTORY) удаляются автоматически. Примерно так:

ALTER TABLE NEED_STATUS_HISTORY
  ADD CONSTRAINT NEED_STATUS_HISTORY_FK1
    FOREIGN KEY (NEED_ENTL_PUID) REFERENCES NEED_ENTL (NEED_ENTL_PUID)
      ON DELETE CASCADE;

ALTER TABLE NEED_ENTL_ORDER_HISTORY
  ADD CONSTRAINT NEED_ENTL_ORDER_HISTORY_FK1
    FOREIGN KEY (NEED_ENTL_PUID) REFERENCES NEED_ENTL (NEED_ENTL_PUID)
      ON DELETE CASCADE;

ALTER TABLE NEED_ENTL_NOTIF_HISTORY
  ADD CONSTRAINT NEED_ENTL_NOTIF_HISTORY_FK1
    FOREIGN KEY (NEED_ENTL_PUID) REFERENCES NEED_ENTL (NEED_ENTL_PUID)
      ON DELETE CASCADE;

Затем, когда вы вводите команду DELETE:

DELETE FROM NEED_ENTL
  WHERE USER_GUID = X;

все строки в NEED_STATUS_HISTORY, NEED_ENTL_ORDER_HISTORY и NEED_ENTL_NOTIF_HISTORY которые относятся к строке (строкам), которую вы удалили из NEED_ENTL, будут автоматически удалены без необходимости делать что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...