2017-08-24 33 views
0

首先,我明白爲什麼我會收到此錯誤消息,並且知道解決該錯誤的方法,但是我希望獲得比我腦子裏想的是什麼。這基本上就是我:「?」NodeJS + MySQL,使用JOIN進行更新,列名不明確

UPDATE customer c 
    JOIN customer d ON c.customer_id = d.parent_customer_id 
    SET ? 
    WHERE d.customer_type = "Big Cheese"; 

因此,該數據被送入到參數如下:

{"customer_id": 10, "customer_name": "Cheese-It", ... } 

的問題是,因爲我加入一個表,基本上是自己,所有的列具有相同的名稱。我知道如何解決這個問題的唯一方法是編輯JSON和前綴的所有領域與它需要的別名:

{"c.customer_id": 10, "c.customer_name": "Cheese-It", ... } 

我希望的要對此更優雅的方式。有沒有辦法重構我的SQL,以便它知道我想更新哪個表別名?有任何想法嗎?

+0

逐字替換查詢中'SET'後面的'?'是沒有意義的。也許你應該向我們展示你真正想要的查詢。 –

回答

0

子查詢將執行您想要的操作,但實際上效率較低,因爲WHERE子句中的子查詢通常是性能殺手。我覺得你必須將JSON解析爲SQL,所以我只需簡單地添加別名即可。

無論如何,僅供參考,這裏是你如何重構SQL不需要一個別名:

UPDATE customer 
SET ? 
WHERE customer_id IN (
    SELECT c.customer_id 
    FROM customer c 
    JOIN customer d ON c.customer_id = d.parent_customer_id 
    WHERE d.customer_type = 'Big Cheese' 
); 

注:這是未經測試

編輯:

關於第二個想法, EXISTS子句的性能會略好:

UPDATE customer c 
SET ? 
WHERE EXISTS (
    SELECT 1 
    FROM customer d 
    WHERE d.parent_customer_id = c.customer_id 
     AND d.customer_type = 'Big Cheese' 
); 

無論哪種方式應該工作。只要在更新中沒有JOINSET列只能引用一個表,因此您將避免不明確的列名錯誤。