1

2 つの製品テーブルがあります。テーブル A は「デフォルト」のテーブルです (データ フィードから取得され、毎週自動的に更新されます)。テーブル B は、テーブル A の値を手動で上書きするために使用され、テーブルと同じ列に加えていくつかの列があります。両方のテーブルには常に同じ UniqueID 列があります。

A からのすべての値と B からのすべての値をプルする select ステートメントが必要です。B からの値が null でない限り、B は A からの値を上書きします。 "0" で埋められています)。

LEFT JOIN を使用してみましたが、null 値と「0」値に問題があります。

私はphpでデータを使用しており、1行だけを取得する必要がある場合に処理できます。それぞれに対してクエリを実行し、A の連想配列を抽出し、B 配列をフィルター処理してから抽出します。しかし、20 ~ 200 行を取得し始めると、そのプロセスは非常に扱いにくくなります。

テーブル A には約 400,000 行があり、B が 10,000 ~ 20,000 を超えることはありません。

ご協力いただきありがとうございます。

更新:これが私が仕事をするようになったコードです。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1 = 0, a.Price1, b.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

更新 2: シンプルな方が良いです。IF() はヌルとゼロの両方に対応します。

IF(expr1,expr2,expr3)

expr1 が TRUE ( expr1 <> 0 および expr1 <> NULL ) の場合、IF() は expr2 を返します。それ以外の場合は expr3 を返します。IF() は、使用されるコンテキストに応じて、数値または文字列の値を返します。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1, b.Price1, a.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

4

1 に答える 1

4

これですべてのシナリオをカバーできると思います:

SELECT 
   COALESCE(b.nullablefield, a.nullablefield) as nullablefield,
   IF(b.intfield = 0, a.intfield, b.intfield) as intfield,
   IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield,
   ... etc ...
FROM table_a a
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID
于 2011-02-03T21:56:16.233 に答える