NIRMAL AJAY Ответов: 5

Как мне ... удалить строки из двух таблиц в одном SQL-запросе


Привет друг,

у меня есть два имени таблиц

1.
CREATE TABLE [Bill]
(       [Id] [int] IDENTITY(1,1) NOT NULL,         --Primary key
	    [Bill_No] [int] NOT NULL,
	    [Date] [datetime] NOT NULL
)

2.
CREATE TABLE [BILL_ITEMS]
(
	           [Id] [int] IDENTITY(1,1) NOT NULL,--Primary key
	           [Bill_Id] [int] NOT NULL,          --Foreign key
	           [Product_Id] [int] NOT NULL
)


1. 'Счет' три столбец с именем 'идентификатор', 'Bill_No', 'дата'

2. 'BILL_ITEMS' также имеет три столбца 'Id', 'Bill_Id', 'Product_Id' в этой таблице столбец 'Bill_Id' совпадает с столбцом 'Bill_No', который находится в таблице 'BILL'.

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

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

DELETE FROM Bill WHERE Bill_No EXISTS IN=
                                       
               (     SELECT  B.Id, B.Bill_No , B.Date, I.Id, I.Bill_Id, I.Product_Id
                     FROM
                     Bill AS B, BILL_ITEMS AS I WHERE B.Bill_No = I.Bill_Id
                     AND
                     B.Date >= CAST('2017-02-08 12:07:40.330' AS Date)
                     AND
                     B.Date <= CAST('2017-02-19 12:09:13.560' AS Date)
               )

5 Ответов

Рейтинг:
2

Peter Leow

Вы не можете сделать это в одном запросе, так как вы не можете установить внешние ключи с каскадным удалением[^Поэтому сделайте это в двух запросах подряд. Попробовать это:
Во-первых, удалите данные из таблицы bill_items на основе диапазона дат в таблице bill:

DELETE FROM bill_items bi WHERE EXISTS
(
SELECT * FROM bill b WHERE b.bill_no = bi.bill_id AND [Date] BETWEEN '2017-02-08' AND '2017-02-19'
}
, за которым следуют
DELETE FROM bill WHERE [Date] BETWEEN '2017-02-08' AND '2017-02-19'
Вы можете использовать точку с запятой, чтобы соединить эти два запроса и отправить их на сервер за один раз.


Рейтинг:
1

Michael_Davies

Что-то вдоль линий:

DELETE FROM [Bill],[BILL_ITEMS] USING [Bill] 
LEFT JOIN [BILL_ITEMS] ON [BILL_ITEMS].Bill_No=[Bill].Bill_Id
WHERE [Bill].Date >= CAST('2017-02-08 12:07:40.330' AS Date)
AND
[Bill].Date <= CAST('2017-02-19 12:09:13.560' AS Date)


NIRMAL AJAY

я столкнулся с ошибками, я думаю, что sql не допускает запятых в операторе DELETE (DELETE FROM[Bill], [BILL_ITEMS]), я не знаю, как вы можете использовать этот оператор

Michael_Davies

Работает в MySQL без проблем.

CHill60

Я предполагаю, что вы используете SQL Server тогда - если бы вы правильно отметили свой вопрос, мы бы знали, что

CHill60

5 б. Это не работает в SQL Server, но поскольку OP не указал, какую версию sql они использовали, это не ваша вина.

Рейтинг:
1

Richard Deeming

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

Предполагая, что Microsoft SQL Server, что-то вроде этого должно работать:

BEGIN TRY;
BEGIN TRANSACTION;
    
    DELETE
    FROM 
        I
    FROM 
        Bill_Items As I
        INNER JOIN Bill As B
        ON B.Bill_Id = I.Bill_No
    WHERE
        B.Date Between @MinDate And @MaxDate
    ;
    
    DELETE 
    FROM 
        Bill 
    WHERE 
        Date Between @MinDate And @MaxDate
    ;
    
    COMMIT;
END TRY
BEGIN CATCH;
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;


Рейтинг:
1

NIRMAL AJAY

это работает правильно

DELETE FROM Bill WHERE EXISTS (SELECT ... )


Рейтинг:
0

sachin.vishwa90

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

create storedprocedure yourprocedurename
as
begin

delete from firsttable where somecondition

delete from secondtable where somecondition

end


CHill60

Только 3, Как вы должны были указать, чтобы сначала удалить из bill_items (из-за ограничения внешнего ключа)