用select上的另一个表覆盖/加入MySQL表

时间:2011-02-03 21:18:21

标签: mysql join null left-join zero

我有两个产品表。表A是“默认”表(来自数据源每周自动更新)。表B用于手动覆盖表A中的值,并且具有与表相同的列以及更多列。两个表始终具有相同的UniqueID列。

我需要一个select语句,它从A中提取所有值,从B中提取所有值,其中B覆盖A中的值,其中B的值为null,= 0或等于0.00(列设置为整数2个小数点并填充“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()解决了null和零。

如果(表达式1,表达式2,表达式3)

如果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";

1 个答案:

答案 0 :(得分:3)

我认为这可以涵盖所有场景:

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