2017-08-24 10 views
0

まず、このエラーメッセージが表示される理由を理解しています。これを解決する方法はわかりましたが、私が心に留めていること。ここに基本的には私が持っているものです:NodeJS + MySQL、UPDATE、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", ... } 

問題は、あります。私はこれについて行くのよりエレガントな方法を期待していた

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

:私はこの問題を解決する方法を知っている唯一の方法は、JSONを編集し、それが必要と別名ですべてのフィールドを接頭辞です。 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' 
); 

注:これはテストされていない

EDIT:二思想に

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' 
); 

いずれにしてもうまくいくはずです。更新にJOINがない限り、SET列が参照できるテーブルは1つしかないため、あいまいな列名のエラーを避けることができます。