这很难解释,所以我会尽力而为。
我有一个由默认行(由 NULL
specificSiteID
标记)和覆盖行(由 NON-NULL
标记)组成的表 specificSiteID
s.)
两种类型的行都使用 genericID
来确定正在加载的数据——有时,某些数据可能没有默认值。
编辑 1: 我所指的非空 specificSiteID
仅在其站点 ID 与我查询的站点 ID 匹配时覆盖默认值。我不会将所有覆盖应用到一个默认值 -- 我只将 specificSiteID
的覆盖应用到默认值。
结束编辑 1
我对这个查询有四个要求:
- 当既没有默认值也没有特定于行的覆盖时不返回任何数据。
- 当没有默认数据时返回覆盖数据
- 返回覆盖数据在覆盖数据不为 null 的地方覆盖默认数据
- 最后,仅在默认数据存在且没有覆盖数据时返回默认数据。
现在,我的 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不支持full join,但是可以用“left join”+“right join”来模拟。
我认为 genericID 34 和 specificSiteID 84 是示例,您需要加入所有 genericID,其中 specificSiteId 为 null(默认)且不为 null(覆盖),不是吗?
SELECT COALESCE( override.Col1 , default.Col1) as Col1,
COALESCE(override.Col2, default.Col2) as Col2
FROM (SELECT * from tableA where specificSiteID IS NULL ) as default
LEFT JOIN (SELECT * from tableA where specificSiteID is not null ) as override
ON default.genericID = override.genericID
UNION
SELECT COALESCE( override.Col1 , default.Col1) as Col1,
COALESCE(override.Col2, default.Col2) as Col2
FROM (SELECT * from tableA where specificSiteID IS NULL ) as default
RIGHT JOIN (SELECT * from tableA where specificSiteID is not null ) as override
ON default.genericID = override.genericID
但是从这个查询来看,您的数据库设计似乎并不适合您的情况
关于mysql - MySQL Merging Queries的JOIN问题--Overwrite or Merge two rows from the same table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902415/