我有一个mySQL表,其中包含一组参考数据。我有另一个表中包含数据的表,它描述了此参考数据的更新或附加条目。由于各种原因我不会介入,重要的是参考数据保持不变,因为特定用户出现并创建记录(因此第二个表)。这些表之间的模式与具有2键复合主键的“自定义”表的例外相同。其中一列在“自定义”和引用表之间共享。
我想在这些表上的单个SQL语句中执行的业务逻辑如下:
如果“自定义”表中存在的记录具有与参考表中相同的键值,则采用“自定义”。否则,请取参考值。
我想也许我可以使用RIGHT JOIN,或者甚至可以在UNION操作符上进行一些操作来控制返回的内容。我一直在加扰SQL的逻辑。 JOIN将从一个表中获取信息以与另一个表连接,这是我真的不想要的。 UNION将简单地删除表之间的重复....这是关闭的。
类似的东西:
SELECT * FROM自定义UNION SELECT * FROM reference
除非所有列都相同,否则只会删除重复项。如果有任何不同(因为这就是自定义条目存在的原因),那么UNION什么都不做,只能将两个表的内容混合在一起。
我是不是错了?
感谢您提供的任何见解。
答案 0 :(得分: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)
答案 1 :(得分: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'
答案 2 :(得分: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不支持此类函数。