【问题标题】:JOIN question for MySQL Merging Queries--Overwrite or Merge two rows from the same tableMySQL 合并查询的 JOIN 问题--覆盖或合并同一表中的两行
【发布时间】:2011-06-21 14:32:04
【问题描述】:

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

我有一个表,其中包含默认行(由 NULLspecificSiteID 表示)和覆盖行(由 NON-NULLspecificSiteIDs 表示)

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

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

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

  1. 当既没有默认值也没有特定于行的覆盖时,不返回任何数据。
  2. 没有默认数据时返回覆盖数据
  3. 在覆盖数据不为空的情况下,返回覆盖数据覆盖默认数据
  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 join merge overwrite coalesce


【解决方案1】:

由于Mysql不支持全连接,但是可以使用“左连接”+“右连接”来模拟。

我认为 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

但是看这个查询似乎你的数据库设计不是更适合你的情况

【讨论】:

  • 回答您的问题:我只需要加入与genericID 匹配的行和一个空specificSiteID 与匹配genericIDspecificSiteID 匹配提供的ID 的行。 EG:如果在我的示例中我的 specificSiteID 为 86,我最多只会收集两行,而不是大量。 下一步:然后我查看了您提供的代码以查看它是否适用,但我最初的解释可能有误。我会尝试编辑它。 :)(谢谢您的 +1,顺便说一句!)
猜你喜欢
  • 2013-11-22
  • 2015-01-31
  • 2014-09-28
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多