这很难解释,所以我会尽力的。
我有一个表,它由默认行(由NULL specificSiteID注意到)和覆盖行(由非NULLspecificSiteIDs注意到)组成。
两种类型的行都使用genericID来确定正在加载的数据--有时,某些数据可能没有默认值。
编辑1:我所指的非空specificSiteID只有在其siteID与我所查询的siteID匹配时才覆盖默认值。我不将所有重写应用于一个默认设置--我只对默认值应用specificSiteID的覆盖。结束编辑1。
我有四个查询要求:
当既没有默认的数据,也没有特定于行的override.
现在,我的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;这个脚本的问题是,由于LEFT JOIN,第二种情况失败了。如果没有默认行LEFT JOIN 84,则不包含覆盖行。使用上述示例,如果没有genericID =84( specificSiteID为NULL ),则不返回数据,即使存在覆盖数据。
我在找什么样的JOIN?我甚至可以用JOIN来报道这件事吗
发布于 2011-02-04 23:52:47
因为Mysql不支持完全连接,但是您可以使用“左连接”+“右连接”来模拟它。
我认为genericID 34和specificSiteID 84是示例,您需要连接所有specificSiteId为null (默认)和null (覆盖)的通用is,不是吗?
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但是,查看这个查询似乎您的DB设计并不适合您的情况。
https://stackoverflow.com/questions/4902415
复制相似问题