2015-11-13 33 views
1

我想在一個表Points使用來自同樣的表查詢的數據插入一個新的記錄,但我得到以下錯誤MySQL錯誤1093

#1093 - You can't specify target table 'Points' for update in FROM clause

下面是查詢:

insert into Points (`userID`,`restaurantID`,`franchiseID`,`points`) 
values (16,5,1,((SELECT 
         FORMAT(SUM(itemPrice)/10,0) 
       FROM 
        Orders left join Menu using(menuID) 
       WHERE 
        logID = 701)+ 
       (SELECT 
        SUM(points) 
       FROM 
        Points 
       WHERE `userID` = 16 AND `franchiseID`=1))) 

我不擅長MySQL,所以我想知道是否有解決這個問題的解決方法。在此先感謝

+0

我想如果你將工作將整個'((SELECT ...'franchiseID' = 1))'東西包裝在子查詢中。 –

+0

您也可以將'select'的結果存儲在一個變量中並插入此變量。 – PhillipD

回答

2

您可以將臨時結果存儲在用戶變量:

SET @sum_val := (SELECT 
         FORMAT(SUM(itemPrice)/10,0) 
       FROM 
        Orders left join Menu using(menuID) 
       WHERE 
        logID = 701)+ 
       (SELECT 
        SUM(points) 
       FROM 
        Points 
       WHERE `userID` = 16 AND `franchiseID`=1)); 
insert into Points (`userID`,`restaurantID`,`franchiseID`,`points`) 
values (16,5,1,@sum_val); 
+0

非常感謝你......完美地工作 – spongyboss

2

看起來像MySQL不會讓你這樣做。我設置了一個人爲的例子,並得到了相同的結果:

create table blah (a bigint not null primary key auto_increment, b varchar(6)); 
insert into blah (b) values ('junk'); 

select * from blah; 
+---+------+ 
| a | b | 
+---+------+ 
| 1 | junk | 
+---+------+ 

insert into blah (b) values ((select b from blah where a = 1)); 
ERROR 1093 (HY000): You can't specify target table 'blah' for update in FROM clause 

對不起,哥們!從MySQL文檔(http://dev.mysql.com/doc/refman/5.7/en/subqueries.html):

在MySQL中,您無法修改表並從子查詢中的同一表中進行選擇。這適用於諸如DELETE,INSERT,REPLACE,UPDATE和(因爲子查詢可以在SET子句中使用)的語句LOAD DATA INFILE。

薩沙Pachev的回答是一個很好的建議,但Giorgos Betsos在這個答案評論建議優雅的解決方法:

insert into blah (b) values ((select b from (select b from blah where a = 1) as t)); 

select * from blah; 
+---+------+ 
| a | b | 
+---+------+ 
| 1 | junk | 
| 2 | junk | 
+---+------+ 

通過使用別名添加子查詢的另一層,它看起來像MySQL創建封面下的一張臨時桌子,從而解決了這個限制。 (不幸的是我安裝的MySQL版本不會解釋插入,但解釋嵌套子查詢顯示派生表)

+1

是的,但有一個解決方法:'插入等於(b)的值 ((從b選擇b(從blah中選擇b,其中a = 1)作爲t));' –

+0

Oo,好的!這是值得回答的。 –

+0

把這個放入你的答案中,我會加油! –

相關問題