Удаление строк в двух таблицах на основе условий в двух разных таблицах

#sql-server #tsql #stored-procedures

#sql-сервер #tsql #хранимые процедуры

Вопрос:

Долгое время просмотра, первый раз спрашивающий

В настоящее время я работаю над чем-то, где мне нужно удалять данные в двух таблицах на основе условий в двух разных таблицах. Я всего лишь новичок в SQL, и это было у меня все утро.

Два условия заключаются в том, что для GDPR в таблице клиентов установлено значение N и что дата платежа в таблице платежных транзакций превышает 30 дней

 create proc MemberDelete

delete from ClientsPersonalInfo
from Clients, PaymentTransaction
where ClientsPersonalInfo.ClientID = Clients.ClientID and Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE()) from PaymentTransaction)>30

delete from GymCard
from Clients, PaymentTransaction
where GymCard.ClientID = Clients.ClientID and Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE()) from PaymentTransaction)>30

If @@rowcount <>1
rollback

else 
Commit
 

Действительно не уверен, где я ошибаюсь с этим? Ошибка, которую я получаю, заключается в следующем: «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение «.

Суть процедуры заключается в жестком удалении данных из ClientPersonalInfo и GymCard, если их идентификатор клиента подпадает под два условия в таблице Clients и PaymentTransaction. Это связано с тем, что клиент не поставил галочку в поле для GDPR, чтобы мы сохранили информацию, и что дата их последнего платежа превышает 30 дней.

Комментарии:

1. «Действительно не уверен, что я ошибаюсь в этом?» Что не так с тем, что у вас есть? Вы нам не говорите. Кроме того, вам давно пора перестать использовать этот древний синтаксис СОЕДИНЕНИЯ. Синтаксис соединения ANSI-92 существует уже почти 30 лет.

2. Образцы данных и желаемые результаты могли бы помочь. Также полезным было бы описание того, что вы хотите сделать.

3. Прошу прощения, я должен был вдаваться в подробности. При попытке выполнить его я получаю следующие ошибки. «Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение «. Что я хочу сделать, так это если идентификатор клиента соответствует обоим условиям в таблицах PaymentTransaction и Clients, я хочу удалить все данныеони находятся в таблицах ClientsPersonalInfo и GymCard.

4. какова связь между клиентами и PaymentTransaction? Это тоже ClientID?

5. НЕ пытайтесь зафиксировать транзакцию, которая не была запущена вашей процедурой. Процесс, который запускает транзакцию, должен нести (и, вероятно, предполагает, что он несет) эту ответственность и полагается на это для завершения (предположительно) более сложного процесса, частью которого является ваша процедура. Если это не ваш дизайн, то исправьте его.

Ответ №1:

Вы должны ПРИСОЕДИНИТЬСЯ к PaymentTransaction, используя ClientID.

Вам также необходимо ПРИСОЕДИНИТЬСЯ к GymCard с помощью PaymentTransaction.

 create proc MemberDelete

delete from ClientsPersonalInfo
from Clients, PaymentTransaction
where 
  ClientsPersonalInfo.ClientID = PaymentTransaction.ClientID and
  ClientsPersonalInfo.ClientID = Clients.ClientID and
  Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE())
                          from PaymentTransaction
                          where
                            ClientsPersonalInfo.ClientID = PaymentTransaction.ClientID)>30

delete from GymCard
from Clients, PaymentTransaction
where 
  GymCard.ClientID = Clients.ClientID and
  GymCard.ClientID = PaymentTransaction.ClientID and
  Clients.GDPR = 'N' and (select datediff(dd,PaymentDate,GETDATE())
                          from PaymentTransaction
                          where
                            GymCard.ClientID = PaymentTransaction.ClientID)>30

If @@rowcount <>1
rollback

else 
Commit
 

Комментарии:

1. Этот ответ определенно на правильном пути, но я хочу указать на пару вещей. Я не думаю, что вы можете откатить или зафиксировать транзакцию без «Begin Tran». Кроме того, переменная @@rowcount предоставит вам количество строк, связанных только с самым последним оператором.