mysql - MySQL Merging Queries的JOIN问题--Overwrite or Merge two rows from the same table

标签 mysql join merge overwrite coalesce

这很难解释,所以我会尽力而为。

我有一个由默认行(由 NULL specificSiteID 标记)和覆盖行(由 NON-NULL 标记)组成的表 specificSiteIDs.)

两种类型的行都使用 genericID 来确定正在加载的数据——有时,某些数据可能没有默认值。

编辑 1: 我所指的非空 specificSiteID 仅在其站点 ID 与我查询的站点 ID 匹配时覆盖默认值。我不会将所有覆盖应用到一个默认值 -- 我只将 specificSiteID 的覆盖应用到默认值。 结束编辑 1

我对这个查询有四个要求:

  1. 当既没有默认值也没有特定于行的覆盖时不返回任何数据。
  2. 当没有默认数据时返回覆盖数据
  3. 返回覆盖数据在覆盖数据不为 null 的地方覆盖默认数据
  4. 最后,仅在默认数据存在且没有覆盖数据时返回默认数据。

现在,我的 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 其中specificSiteIDNULL,不返回数据,即使有覆盖数据。

我在寻找哪种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/

相关文章:

python - 连接到 mysql 时如何告诉 django 使用 --skip-secure-auth?

Java 应用程序进行数据库转储

mysql - 有什么办法连接 MySql 和 PostgreSQL 的表吗?

eclipse - SVN:在 Eclipse 中将分支与主干同步?

mysql - 了解数据库中的键

MySQL - 将表数据复制到不同的表

mysql - 将连接表从一行更新到另一行

python : The most efficient way to join two very big (20+ GB) datasets?

git - 了解如何处理 Git 中的文件删除

sql-server - 水平连接两个查询