mysql - 在选择时用另一个表覆盖/加入 MySQL 表

标签 mysql join null left-join zero

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

我需要一个 select 语句,它从 A 中提取所有值并从 B 中提取所有值,B 覆盖 A 中的值,除非 B 中的值为空,= 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) 作为颜色, IF(b.Price1 = 0, a.Price1, b.Price1) 作为 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 为真(expr1 <> 0 且 expr1 <> NULL),则 IF() 返回 expr2;否则返回 expr3。 IF() 返回数字或字符串值,具体取决于使用它的上下文。

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

最佳答案

我认为这足以涵盖您的所有场景:

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

关于mysql - 在选择时用另一个表覆盖/加入 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4891847/

相关文章:

sql - 为什么这个 SQL 代码给出错误 1066(不是唯一的表/别名 : 'user' )?

sql - 如何不插入具有空值的双记录

mysql - (初学者)SQL查询无缘无故抛出错误

MySQL 存储过程的字符串问题。原始输出看起来不错,但在查询中返回空集

mysql - 使用另外 2 个表中的数据插入到表中

mysql - 我如何在 MySQL 嵌套选择查询中 "reset"变量(SUM(x) 作为变量)

php - 左连接中的两个表都有 id 字段。尝试从第一个数据库中提取 id 字段,但获取第二个数据库

MySQL从另一个表中选择前4名男性分数和前2名女性分数

java - 如何使用 GSON 只返回一个特定的空字段?

java - 为什么 null 不是编译时常量?