Ответ 1
DELETE TableA
FROM TableA a
INNER JOIN TableB b
ON b.Bid = a.Bid
AND [my filter condition]
должен работать
Сценарий:
Скажем, у меня две таблицы: TableA и TableB. Первичный ключ TableB - это один столбец (BId) и является столбцом внешнего ключа в TableA.
В моей ситуации я хочу удалить все строки в таблицеA, связанные с определенными строками в TableB: могу ли я сделать это через соединения? Удалить все строки, которые втянуты из соединений?
DELETE FROM TableA
FROM
TableA a
INNER JOIN TableB b
ON b.BId = a.BId
AND [my filter condition]
Или я вынужден сделать это:
DELETE FROM TableA
WHERE
BId IN (SELECT BId FROM TableB WHERE [my filter condition])
Причина, по которой я спрашиваю, мне кажется, что первый вариант был бы намного более эффективным при работе с большими таблицами.
Спасибо!
DELETE TableA
FROM TableA a
INNER JOIN TableB b
ON b.Bid = a.Bid
AND [my filter condition]
должен работать
Я бы использовал этот синтаксис
Delete a
from TableA a
Inner Join TableB b
on a.BId = b.BId
WHERE [filter condition]
Да, вы можете. Пример:
DELETE TableA
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
пытался сделать это с помощью базы данных доступа и обнаружил, что мне нужно использовать a. * сразу после удаления.
DELETE a.*
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
Это почти то же самое в MySQL, но вы должны использовать псевдоним таблицы сразу после слова "DELETE":
DELETE a
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]
Синтаксис выше не работает в Interbase 2007. Вместо этого мне пришлось использовать что-то вроде:
DELETE FROM TableA a WHERE [filter condition on TableA]
AND (a.BId IN (SELECT a.BId FROM TableB b JOIN TableA a
ON a.BId = b.BId
WHERE [filter condition on TableB]))
(Примечание. Interbase не поддерживает ключевое слово AS для псевдонимов)
Скажем, у вас есть две таблицы, одна с набором мастеров (например, Employees) и одна с дочерним набором (например, зависимые), и вы хотите избавиться от всех строк данных в таблице зависимостей, не может работать с любыми строками в главной таблице.
delete from Dependents where EmpID in (
select d.EmpID from Employees e
right join Dependents d on e.EmpID = d.EmpID
where e.EmpID is null)
Здесь следует отметить, что вы просто собираете "массив" EmpIDs из первого соединения, используя этот набор EmpID для выполнения операции "Удаление" в таблице "Зависимые".
В SQLite единственное, что работает, похоже на ответ beauXjames.
Кажется, доходит до этого DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
и что некоторая временная таблица может быть разбита с помощью SELECT и JOIN вашей двух таблиц, которую вы можете отфильтровать эту временную таблицу на основе условия, которое вы хотите удалить в таблице.
вы можете запустить этот запрос: -
Delete from TableA
from
TableA a, TableB b
where a.Bid=b.Bid
AND [my filter condition]
Я использую этот
DELETE TableA
FROM TableA a
INNER JOIN
TableB b on b.Bid = a.Bid
AND [condition]
и метод @TheTXI хороши как достаточно, но я читал ответы и комментарии, и я обнаружил, что на одну вещь нужно ответить, используя условие в предложении WHERE или как условие соединения. Поэтому я решил проверить его и написать фрагмент, но не нашел значимой разницы между ними. Вы можете увидеть sql script здесь, и важным моментом является то, что я предпочел написать его как commnet, потому что это не точный ответ, но он большой и не может быть помещен в комментарии, пожалуйста, простите меня.
Declare @TableA Table
(
aId INT,
aName VARCHAR(50),
bId INT
)
Declare @TableB Table
(
bId INT,
bName VARCHAR(50)
)
Declare @TableC Table
(
cId INT,
cName VARCHAR(50),
dId INT
)
Declare @TableD Table
(
dId INT,
dName VARCHAR(50)
)
DECLARE @StartTime DATETIME;
SELECT @startTime = GETDATE();
DECLARE @i INT;
SET @i = 1;
WHILE @i < 1000000
BEGIN
INSERT INTO @TableB VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
INSERT INTO @TableA VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)
SET @i = @i + 1;
END
SELECT @startTime = GETDATE()
DELETE a
--SELECT *
FROM @TableA a
Inner Join @TableB b
ON a.BId = b.BId
WHERE a.aName LIKE '%5'
SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())
SET @i = 1;
WHILE @i < 1000000
BEGIN
INSERT INTO @TableD VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
INSERT INTO @TableC VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)
SET @i = @i + 1;
END
SELECT @startTime = GETDATE()
DELETE c
--SELECT *
FROM @TableC c
Inner Join @TableD d
ON c.DId = d.DId
AND c.cName LIKE '%5'
SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())
Если вы можете получить вескую причину из этого script или написать другое полезное, пожалуйста, поделитесь. Спасибо и надеюсь, что эта помощь.
Более простой способ:
DELETE TableA
FROM TableB
WHERE TableA.ID = TableB.ID