1

我有一个 mySQL 表,其中包含一组参考数据。我有另一个表,其中包含描述此参考数据的更新或附加条目的数据。由于各种原因,我不会深入讨论,重要的是参考数据在特定用户出现并创建记录时保持不变(因此是第二个表)。除了具有 2 键复合主键的“自定义”表之外,这些表之间的架构是相同的。其中一列在“自定义”表和参考表之间共享。

我想在这些表的单个 SQL 语句中执行的业务逻辑如下:

如果“自定义”表中存在与引用表中的键值相同的记录,则采用“自定义”。否则,取参考值。

我想也许我可以使用 RIGHT JOIN,或者甚至对 UNION 运算符进行一些扭曲来控制返回的内容。不过,我一直在搞乱 SQL 的逻辑。JOIN 将从一个表中获取信息以与另一个表连接,我真的不是在寻找。UNION 将简单地删除表之间的重复项......这很接近。

就像是:

SELECT * FROM 自定义 UNION SELECT * FROM 参考

除非所有列都相同,否则只会删除重复项。如果有任何不同(因为这就是自定义条目存在的原因),那么 UNION 只会将两个表的内容混合在一起。

我对这一切都错了吗?

感谢您提供的任何见解。

4

3 回答 3

3

有几种方法可以做到这一点。至少根据我对您的情况的解释,这是一个应该得到您需要的工会:

select KeyCol, Col2, Col3
from CustomTable
union all
select KeyCol, Col2, Col3
from RefTable
where KeyCol not in (select KeyCol from CustomTable)

我假设您的 RefTable 和 CustomTable 具有一对零或一的关系,例如,您没有任何 Ref 的多个自定义记录(但这仍然可以工作)。

更新:

您可能还需要自定义的额外键列:

select KeyCol, Col2, Col3, CustomKey
from CustomTable
union all
select KeyCol, Col2, Col3, null as CustomKey
from RefTable
where KeyCol not in (select KeyCol from CustomTable)
于 2012-07-12T20:35:15.990 回答
1

听起来像一个左外连接与右值和左值的 COALESCE()。

SELECT COALESCE(c.val, r.val) as val, ...
FROM reference as r LEFT OUTER JOIN custom as c ON c.ID = r.ID AND c.Project = 'ProjectX'
于 2012-07-12T20:33:59.517 回答
0

归因于@TimLehner,您可能想要的是对他的查询进行轻微修改。我的猜测是您想要最新的客户修改。我会进一步猜测这具有最大的自定义键。

为此,您需要查询中的另一个子句:

select KeyCol, Col2, Col3, CustomKey
from CustomTable ct join
     (select max(CustomKey) as maxCustomKey from CustomTable group by KeyCol, Col2 Col3
     ) lastkey
     on ct.KeyCol = lastkey.KeyCol and ct.Col2 = lastkey.Col2 and ct.Col3 = lastkey.Col3
union all
select KeyCol, Col2, Col3, null as CustomKey
from RefTable
where KeyCol not in (select KeyCol from CustomTable)

顺便说一句,在大多数其他数据库中,您可以使用更简单的查询和名为 row_number() 的函数来执行此操作,但 mysql 不支持这种类型的函数。

于 2012-07-12T21:56:28.547 回答