2017-08-24 34 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列只能引用一个表,因此您将避免不明确的列名错误。