T-SQL: выбор строк для удаления с помощью соединений

Сценарий:

Допустим, у меня две таблицы: 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] 

Старался сделать это с помощью базы данных доступа и обнаружил, что мне нужно использовать . * Сразу после удаления.

 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 для псевдонимов)

Я использую это

 DELETE TableA FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid AND [condition] 

и метод @TheTXI хорош как достаточно, но я читал ответы и комментарии, и я обнаружил, что на один вопрос нужно ответить, используя условие в предложении WHERE или как условие соединения. Поэтому я решил проверить его и написать fragment, но не нашел значимой разницы между ними. Вы можете увидеть sql-скрипт здесь, и важным моментом является то, что я предпочел написать его как 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()) 

Если вы можете получить веские основания из этого сценария или написать еще одну полезную информацию, пожалуйста, поделитесь ею. Спасибо и надеюсь, что эта помощь.

Предположим, у вас есть две таблицы: одна с набором мастеров (например, 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 вашей двух таблиц, которую вы можете отфильтровать эту временную таблицу на основе условия, которое вы хотите удалить записи в таблице 1.

вы можете запустить этот запрос: –

 Delete from TableA from TableA a, TableB b where a.Bid=b.Bid AND [my filter condition] 

Более простой способ:

 DELETE TableA FROM TableB WHERE TableA.ID = TableB.ID 
  • Сравните DATETIME и DATE, игнорируя временную часть
  • Совокупная функция SQL для захвата только первой из каждой группы
  • T-SQL Pivot? Возможность создания столбцов таблицы из значений строк
  • Преобразование нескольких строк в один с запятой как разделитель
  • Расчет времени с использованием t-sql
  • SQL Pivot от бедного человека. Список вопросов как столбцов и ответов на пользователя в одной строке
  • T-SQL выбирает запрос для удаления нечисловых символов
  • Тестирование неравенства в T-SQL
  • SET против SELECT - В чем разница?
  • Как получить последнюю запись для каждой группы в SQL
  • Можно ли установить начало недели для функции T-SQL DATEDIFF?
  • Interesting Posts

    findViewById () возвращает null для настраиваемого компонента в макете XML, а не для других компонентов

    Объединить данные панели для получения данных балансной панели

    В чем разница между YAML и JSON? Когда нужно отдать предпочтение одному другому

    RequireJS – чувствителен к jQuery?

    как тестировать облачные функции для Firebase локально на ПК

    HorizontalScrollView в ручном режиме

    android: ViewPager и HorizontalScrollVIew

    Родные запросы JPA / Hibernate не распознают параметры

    Порядок выполнения запроса MySQL / предложения

    Как выполнить требования к 20 ГБ для Windows 8 на SSD емкостью 40 ГБ с установкой Windows 7 с диагональю 22 ГБ?

    Итерация по всем парам последовательных элементов в списке

    Простая обработка ошибок VBA Excel

    Как устранить асимметричную скорость PPTP VPN? (Нисходящая линия к клиенту медленная, пропускная способность сервера и отсутствие накладных расходов на шифрование)

    Почему я должен использовать exFAT через NTFS на съемных носителях?

    Как объединить аудио и видео файл в ffmpeg

    Давайте будем гением компьютера.