是否可以将此业务逻辑放在SQL查询中?

时间:2012-07-12 20:26:19

标签: mysql sql select union

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

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

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

我想也许我可以使用RIGHT JOIN,或者甚至可以在UNION操作符上进行一些操作来控制返回的内容。我一直在加扰SQL的逻辑。 JOIN将从一个表中获取信息以与另一个表连接,这是我真的不想要的。 UNION将简单地删除表之间的重复....这是关闭的。

类似的东西:

SELECT * FROM自定义UNION SELECT * FROM reference

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

我是不是错了?

感谢您提供的任何见解。

3 个答案:

答案 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不支持此类函数。