1

次の SQL クエリに問題があります。

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()))

エラー: FROM 句で更新する対象テーブル 'table1' を指定できません

誰かがそれを修正する方法を知っていますか?

4

5 に答える 5

2

これは最もエレガントな方法ではないかもしれませんが、条件を一時テーブルに選択してから、#MyTempTable の WHERE から削除することができます

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
于 2013-09-30T15:41:47.853 に答える
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()
于 2013-09-30T15:40:30.627 に答える
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

   )
于 2013-09-30T15:43:41.747 に答える
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()
于 2013-09-30T15:40:42.997 に答える
0

select 句の一時モードで使用しているテーブルを変更または削除することはできません。ここで説明と代替案を確認できます: MySQL エラー 1093 - FROM 句で更新するターゲット テーブルを指定できません

于 2013-09-30T15:44:18.337 に答える