是否可以将此业务逻辑放入SQL查询中?
我有一个mySQL表,其中包含一组参考数据。我有另一张包含数据的表格,用于描述此参考数据的更新或附加条目。由于各种原因,我不会介入,重要的是参考数据保持不变,因为特定的用户来创建记录(因此第二张表)。这些表之间的模式与具有2键复合主键的“自定义”表的例外是相同的。其中一列是“自定义”和参考表之间共享的。是否可以将此业务逻辑放入SQL查询中?
我想在一个单独的SQL语句来执行这些表的业务逻辑如下:
如果在“自定义”表中存在具有相同键的值是什么在参考表中的记录,然后采取“习俗”。否则,取参考值。
我想也许我可以使用RIGHT JOIN,或者甚至可以使用UNION运算符来控制返回的内容。我一直在争论SQL的逻辑。 JOIN将从一个表中获取信息与另一个表中的信息进行连接,这是我真正不需要的。 UNION将简单地移除表格之间的重复...,这很接近。
喜欢的东西:
SELECT * FROM定制UNION SELECT * FROM参考
除了这只会下降重复,如果所有列是相同的。如果有任何不同(这将是自定义条目存在的原因),那么UNION除了将两个表格的内容混合在一起外什么都不做。
我对这一切都错了吗?
感谢您提供的任何见解。
有几种方法可以做到这一点。下面是应该得到你所需要的,至少根据我自己的情况解释工会:
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)
听起来像一个左外连接,其左右值为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'
有了归属地@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的不支持这种类型的功能。
因此,从两个表中获取所有记录,然后在where子句中尝试过滤出结果集中具有其自定义表中的键的记录。对?这是否意味着最终结果集将缺少其自定义表中存在键值的记录? – Raevik 2012-07-12 20:40:53
Wellll,有点。我的自定义表有一个额外的主键列,这意味着技术上可能会有多个自定义记录,并且具有与参考表中的一条记录相同的keyVal。 – Raevik 2012-07-12 20:43:20
Where子句适用于每个单独的选择,而不是整个联合查询。尽管如此,一个'order by'可能会结束整个事情。 – 2012-07-12 20:46:03