Abed Al Rahman Hussien Balhawan Ответов: 2

Sql delete query клиенты по имени Джонс больше не берут кредит


customer(CUST_ID,CUST_NAME,CUST_ADDRESS,EMP_ID)

table take(CUST_ID,LOAN_NUMBER)

table loan (LOAN_NUMBER,AMOUNT,BRANCH_NAME)


клиенты по имени Джонс больше не берут кредит

я пробовал запрос, но когда я пытаюсь удалить его из таблицы займов, он не работает.

Что я уже пробовал:

delete
from take t,loan l
where exists (select c.cust_name from customer c where c.cust_id=t.cust_id and c.cust_name='Jones')

2 Ответов

Рейтинг:
2

OriginalGriff

Почему ты думаешь, что это сработает?

Он должен логически либо удалить ни одной записи, либо все из них, в зависимости от того, возвращает ли ваш SELECT какие - либо строки или нет-он не связывает таблицы вместе каким-либо значимым образом.
Начните с выбора строк вместо их удаления - это быстрее, чем восстановление базы данных после каждого тестового запуска, - и найдите двойное соединение, которое возвращает правильные данные из базы данных. take и loan таблицы, связанные с правыми идентификаторами из customer стол.

Когда это сработает, измените его на удаление.


Abed Al Rahman Hussien Balhawan

я попробовал select query с join , но до сих пор не могу понять, как преобразовать его в delete

выберите c.cust_name,c.cust_id,l.loan_number
от клиента с
присоединяйтесь принимаем T на C.cust_id=Т.cust_id
присоединяйтесь к кредиту l на l.loan_number=t.loan_number
где c.cust_name = 'Smith'

Рейтинг:
0

MadMyche

Вспомните, что я ответил ранее...
1. что вы должны использовать подзапрос для проверки того, что правильные элементы будут обновлены?
2. вы должны сделать немного больше исследования относительно того, как EXIST работает
Они применимы и здесь...

Используя это, вы просто напрашиваетесь на неприятности... Если по какой-то причине это сработает, то он удалит все записи в списке. Бери и Займ таблицы, если есть имя клиента "Джонс".

WHERE Exists (
  SELECT c.cust_name
  FROM   customer c
  WHERE  c.cust_id = t.cust_id
  AND    c.cust_name='Jones'
)
То, что вы на самом деле хотите сделать, это выбрать все номера кредитов для этого одного клиента...

Что бы я сделал, так это переместил это соединение в подзапрос, чтобы найти все номера займов
SELECT     t.Loan_Number
FROM       Take     t
INNER JOIN Customer c ON t.Cust_ID = c.CustID
WHERE      c.cust_name='Jones'
А затем используйте это как подзапрос, чтобы сначала удалить все кредиты...
DELETE Loan
WHERE  Loan_Number IN (
  -- subquery 
)
Это должно было удалить все записи о кредитах...

Теперь в качестве продолжения удалите записи из таблицы Take, которая использовалась для подключения клиентов к их кредитам.
DELETE Take
WHERE Cust_ID IN (
  SELECT Cust_ID
  FROM   Customer
  WHERE  Cust_Name='Jones'
)


Abed Al Rahman Hussien Balhawan

Удалить кредит
Где loan_number IN (выберите t.loan_number
От Т присоединяйтесь клиент C на C.cust_ID=Т.cust_ID
Где c.cust_name='Jones')

что-то вроде этого ?

MadMyche

Да...
Я не заполнял его так, чтобы вы (1) имели фреймворк для использования и (2) не хотели вводить его снова

Abed Al Rahman Hussien Balhawan

это дает мне ошибку :
ORA-02292: нарушено ограничение целостности (SYS.FK_LOAN_TAKE) - найдена дочерняя запись

MadMyche

Это признак ограничения внешнего ключа; похоже, что может быть еще одна ссылка на этот кредит

Abed Al Rahman Hussien Balhawan

Да,последняя таблица называется branch(branch_name,branch_city, assets)

MadMyche

Затем вам нужно будет сначала удалить эти подчиненные записи.