【发布时间】:2011-06-21 14:32:04
【问题描述】:
这很难解释,所以我会尽力而为。
我有一个表,其中包含默认行(由 NULLspecificSiteID 表示)和覆盖行(由 NON-NULLspecificSiteIDs 表示)
两种类型的行都使用genericID 来确定正在加载的数据——有时,某些数据可能没有默认值。
编辑 1: 我所指的非空 specificSiteIDs 仅在其 siteID 与我要查询的站点ID 匹配时覆盖默认值。我不会将所有覆盖应用于一个默认值——我只将specificSiteID 的覆盖应用于默认值。
结束编辑 1
我对这个查询有四个要求:
- 当既没有默认值也没有特定于行的覆盖时,不返回任何数据。
- 没有默认数据时返回覆盖数据
- 在覆盖数据不为空的情况下,返回覆盖数据覆盖默认数据
- 最后,仅在默认数据存在且没有覆盖数据时返回。
现在,我的 SQL 查询看起来像--
SELECT COALESCE( override.Col1 , default.Col1) as Col1,
COALESCE(override.Col2, default.Col2) as Col2
FROM
(SELECT * from tableA where
genericID = 84 AND
specificSiteID IS NULL ) as default
LEFT JOIN
(SELECT * from tableA where
genericID = 84 AND
specificSiteID = 34 ) as override
ON default.genericID = override.genericID;
这个脚本的问题是案例#2 由于LEFT JOIN 而失败。 当没有LEFT JOIN 的默认行时,不包括覆盖行。 使用上面的示例,如果没有genericID = 84 其中specificSiteID 是NULL,则没有即使有覆盖数据,也会返回数据。
我在寻找什么样的JOIN?我什至可以用JOIN 覆盖这个吗?
【问题讨论】:
-
此时,我决定在编程中而不是在数据库端处理数据合并。
标签: mysql join merge overwrite coalesce