我有一个mySQL表,其中包含一组数据。我有另一个包含数据的表,它描述了这个参考数据的更新或附加条目。由于各种原因,当特定用户出现并创建记录时,参考数据保持不变是很重要的(因此是第二个表)。这些表之间的模式是相同的,除了具有2键复合主键的“定制”表之外。其中一列在“自定义”和引用表之间共享。
我想在这些表上的单个SQL语句中执行的业务逻辑如下:
如果“自定义”表中存在与引用表中相同的键值的记录,则使用“”。否则,取参考值.。
我想也许我可以用一个正确的加入,甚至可能是一些扭曲的联合运算符,以控制什么是回来。不过,我一直在混乱SQL的逻辑。JOIN将从一个表中获取信息以与另一个表连接,这是我实际上并不想要的。联盟只需删除tables....which之间的副本就行了。
类似于:
选择*来自自定义联合选择*来自引用
但是,如果所有列都是相同的,则只需删除重复项。如果有任何不同(因为这就是自定义条目存在的原因),那么UNION只会将两个表的内容合并在一起。
我是不是搞错了?
谢谢你能提供的任何见解。
发布于 2012-07-12 12:35:15
有几种方法可以做到这一点。这是一个应该得到你所需要的,至少根据我对你的情况的解释:
select KeyCol, Col2, Col3
from CustomTable
union all
select KeyCol, Col2, Col3
from RefTable
where KeyCol not in (select KeyCol from CustomTable)
我假设您的RefTable和CustomTable之间有一到零或一的关系,就像对于任何引用都没有多个自定义记录一样(但无论哪种方式都是这样的)。
更新:
您还可能需要自定义中的额外键列:
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-12 12:33:59
听起来像是一个左外部连接,其中包含了右和左值的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-12 13:56:28
将属性归于@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不支持这种类型的函数。
https://stackoverflow.com/questions/11460071
复制