2013-09-30 4 views
1

У меня есть проблемы с помощью следующего запроса SQL:ошибка SQL: DELETE и SELECT FROM конфликта

DELETE FROM table1 WHERE uid = 
(SELECT table1.uid from table1 INNER JOIN table2 ON table2.user = table1.uid 
INNER JOIN table3 ON table3.uid = table2.seminar WHERE table3.end_date < CURDATE())) 

Ошибка: Вы не можете указать целевую таблицу «table1» для обновления в ЕКОМ

Есть ли у кого-нибудь идеи, как это исправить?

+0

table1 идентификатор, кажется, ambigious, потому что вы используете его в внешнем запросе ('delete'), а также во внутреннем запросе, вы должны были бы дать ему псевдоним во внутреннем запросе и использовать его в ваших условиях, чтобы заставить его работать – DrCopyPaste

ответ

0

Попробуйте это: -

DELETE table1 FROM table1 INNER JOIN table2 ON table2.user = table1.uid 
     INNER JOIN table3 ON table3.uid = table2.seminar 
WHERE table3.end_date < CURDATE() 
+0

, прежде чем вы отформатируете свой ответ. Hmmm форматирование выглядит интересным. –

+0

Просто хотелось бы быстро. Но вы выиграли за секунды;) –

+0

вы оба были очень исправны ... спасибо за ваши ответы! теперь он работает! Большое спасибо вам обоим! – Adrian

1

Вы можете альтернативно присоединиться к таблицам.

DELETE table1 
FROM table1 
     INNER JOIN table2 
      ON table2.user = table1.uid 
     INNER JOIN table3 
      ON table3.uid = table2.seminar 
WHERE table3.end_date < CURDATE() 
+0

[смотрит на вас комментарий] (http://stackoverflow.com/questions/19098279/sql-error-delete-and-select-from-conflict/19098331 # comment28236629_19098331) Вам нужно использовать 'FIND_IN_SET()', поскольку значения разделяются запятой. например 'WHERE table3.end_date 0 AND FIND_IN_SET ('69', table1.group)> 0 )', если значение 'table1.group' есть промежутки между ними, вам также необходимо удалить его. например. 'FIND_IN_SET ('67 ', REPLACE (table1.group,' ',' ')> 0' –

2

Это может быть не самый изящный способ, но вы можете выбрать ваши критерии в временную таблицу, затем DELETE FROM WHERE IN #MyTempTable

SELECT table1.uid 
INTO #MyTemp 
from table1 INNER JOIN table2 ON table2.user = table1.uid 
INNER JOIN table3 ON table3.uid = table2.seminar WHERE table3.end_date < CURDATE()) 


DELETE FROM table1 
WHERE uid IN 
(SELECT uid from #MyTemp) 

DROP TABLE #MyTemp 
0

. Мой предпочтительный синтаксис:

Delete deleteAlias 
/* Select *   */ 
from table1 deleteAlias 
where exists (select null from table1 innerTable1 INNER JOIN table2 ON table2.user = innerTable1.uid 
INNER JOIN table3 ON table3.uid = table2.seminar WHERE table3.end_date < CURDATE()) 

AND deleteAlias.uid = innerTable1.uid 

    ) 

Тонкая польза, если этот подход заключается в том, что вы можете заменить простой «select *», чтобы увидеть, что будет удалено до запуска удаления.

/* Delete deleteAlias */ 
Select * 
from table1 deleteAlias 
where exists (select null from table1 innerTable1 INNER JOIN table2 ON table2.user = innerTable1.uid 
INNER JOIN table3 ON table3.uid = table2.seminar WHERE table3.end_date < CURDATE()) 

AND deleteAlias.uid = innerTable1.uid 

    ) 
+0

Все T1 и T2 начинают работать вместе. Предоставляя «внешней» таблице явный псевдоним (table1 deleteAlias ​​в этом примере), когда вы используете предложение exists, вы ясно видите «внутри предложения exist», соединяющего «вне предложения exist» .... (" AND deleteAlias.uid = innerTable1.uid ") в этом примере. Помните, что большая стоимость разработки программного обеспечения - это обслуживание ~, а не начальное создание .......... aka, кто-то должен уметь видеть, что вы делали по дороге ........ даже если это кто-то. – granadaCoder