1

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

我需要一个 select 语句,它从 A 中提取所有值,从 B 中提取所有值,B 覆盖 A 中的值,除非 B 中的值为 null,= 到 0 或等于 0.00(列设置为带 2 个小数点的整数并用“0”填充)。

我尝试使用 LEFT JOIN,但在使用 null 和“0”值时遇到问题。

我正在使用 php 中的数据,当我只需要拉入 1 行时就可以处理它。我查询每个,提取 A 的 assoc 数组,过滤 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 回答