2015-06-27 2 views
0

У меня есть следующие 4 таблицы. Я попытался сделать некоторый PoC (доказательство концепции) для удаления с запросом соединения. Поэтому я попытался удалить строки в таблице «t1» и «mytable» на основе запроса соединения на «table1» и «table2». Запрос на удаление с 't1' и 'mytable' демонстрирует необычное поведение.
Ниже приведен запрос и таблица определение для четырех таблиц:удалить с помощью внутреннего соединения

--query starts here 


DELETE mytable 
FROM Table2 t1 
inner join 
Table2 t2 on t1.Col1=t2.col1  -- the query deletes all the rows from mytable 

DELETE t1 
FROM Table1 
inner join 
Table2 on table1.Col1=table2.col1 -- the query deletes all the rows from t1 
+0

Что вы подразумеваете под «необычным поведением», каков ваш желаемый результат? – Cyclonecode

+0

Я просто экспериментирую с тем, как delete работает с join, поэтому я удаляю из mytable на основе условия соединения в таблице t1 и t2. Но это удаление всех строк в таблице. –

+0

Ну, это не должно быть, если ваша первая таблица имеет отношение ко второй таблице. Возможно, вы должны отредактировать свой вопрос и показать, какие данные находятся в вашей базе данных. – Cyclonecode

ответ

1

Вы не давая предикат для целевой таблицы, так что ваши запросы интерпретируются как JOIN и CROSS.

Это:

DELETE mytable 
FROM Table2 t1 
inner join 
Table2 t2 on t1.Col1=t2.col1 

равносильна этому (будет иметь такой же план выполнения):

DELETE mytable 
FROM mytable 
cross join (Table2 t1 
    inner join 
    Table2 t2 on t1.Col1=t2.col1) 

И это логически эквивалентно следующему:

DELETE mytable 
WHERE EXISTS (SELECT 1 FROM Table2 t1 
    inner join 
    Table2 t2 on t1.Col1=t2.col1) 

Что, если подзапрос имеет по крайней мере одну строку, логически эквивалентную этому:

DELETE mytable 

Вы должны ссылаться на объект, который вы удаляете из соединения.

Как:

DELETE mytable 
FROM mytable 
INNER JOIN Table2 t1 
    ON ???? 
inner join Table2 t2 
    on t1.Col1=t2.col1 

Или, если вы используете псевдоним:

DELETE m 
FROM mytable m 
INNER JOIN Table2 t1 
    ON ???? 
inner join Table2 t2 
    on t1.Col1=t2.col1 
0

Это запрос, вы ищете. Этот запрос удаляет общие данные из table1 и table2 в mytable и t1.

DELETE mytable 
    WHERE COL1 IN (SELECT T1.COL1 FROM TABLE1 T1 INNER JOIN TABLE2 T2 ON T2.COL1=T1.COL1) 

DELETE T1 
    WHERE COL1 IN (SELECT T1.COL1 FROM TABLE1 T1 INNER JOIN TABLE2 T2 ON T2.COL1=T1.COL1)