Как я могу “вычесть” одну таблицу от другого?

Я продолжу и опубликую это как ответ - вам нужно использовать здесь синтаксис LEFT/RIGHT JOIN. СУБД будет логически интерпретировать ваш существующий SQL, чтобы неявно означать INNER объединений.

Кроме того, вам, возможно, придется пересмотреть ваши GROUP BY пункты.

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

6
задан Brian Tompsett - 汤莱恩 2 July 2015 в 17:08
поделиться

6 ответов

Если Вы имеете достаточные права, можно составить новую таблицу и переименовать ту одну к A. Для составления новой таблицы, можно использовать следующий сценарий:

CREATE TABLE TEMP_A AS
SELECT *
FROM   A
MINUS
SELECT *
FROM   B

Это должно работать довольно хороший.

6
ответ дан 8 December 2019 в 18:42
поделиться
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB)

Должен работать. Мог бы требовать времени все же.

3
ответ дан 8 December 2019 в 18:42
поделиться
Delete t2 
from t1 
inner join t2 
  on t1.col1 = t2.col1
  and t1.col2 = t2.col2
  and t1.col3 = t2.col3
  and t1.col4 = t2.col4
  and t1.col5 = t2.col5
  and t1.col6 = t2.col6
  and t1.col7 = t2.col7
  and t1.col8 = t2.col8
  and t1.col9 = t2.col9
  and t1.col10 = t2.col0

Это, вероятно, будет очень медленно, поскольку необходимо было бы индексировать каждое седло, которое очень маловероятно в среде, когда таблица этот размер не имеет никакого первичного ключа, также - оно во время от пика. Что обладало Вами, чтобы иметь таблицу с 9 миллионами записей и никаким первичным ключом?

1
ответ дан 8 December 2019 в 18:42
поделиться

один путь, просто перечислите все столбцы

delete table a
where exists (select 1 from table b where b.Col1= a.Col1 
AND b.Col2= a.Col2 
AND b.Col3= a.Col3
AND b.Col4= a.Col4)
2
ответ дан 8 December 2019 в 18:42
поделиться

Существует ли значение ключа (или значения), который может использоваться?

что-то как

DELETE a
FROM tableA a
INNER JOIN tableB b
on b.id = a.id
0
ответ дан 8 December 2019 в 18:42
поделиться

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

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

Delete from tableA
where exists (select * from tableB
 where tableA.colx1 = tableB.colx1
 and tableA.colx2 = tableB.colx2
 etc. and tableA.colx10 = tableB.colx10).

Идея состоит в том, чтобы перечислить столбцы в порядке селективности и создать индекс на colx1, colx2 и т.д. на tableB. Точное число столбцов в tableB было бы результатом некоторого trial&measure. (Сместите время для создания индекса на tableB с улучшенным временем оператора удаления.)

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

1
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: