1

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

我有一个表,它由默认行(由 a 标记NULL specificSiteID)和覆盖行(由非标记NULL specificSiteID)组成。

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

编辑 1:我所指的 Non-nullspecificSiteID仅在其 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 where specificSiteIDis NULL,则即使有覆盖数据,也不会返回任何数据。

JOIN我在找什么样的人?我什至可以用JOIN?

4

1 回答 1

1

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

我认为 genericID 34 和 specificSiteID 84 是示例,您需要连接所有 genericID,其中 specificSiteId 为空(默认)且不为空(覆盖),不是吗?

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

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

于 2011-02-04T23:52:47.263 回答