2012-07-12 77 views
1

我有一个mySQL表,其中包含一组参考数据。我有另一张包含数据的表格,用于描述此参考数据的更新或附加条目。由于各种原因,我不会介入,重要的是参考数据保持不变,因为特定的用户来创建记录(因此第二张表)。这些表之间的模式与具有2键复合主键的“自定义”表的例外是相同的。其中一列是“自定义”和参考表之间共享的。是否可以将此业务逻辑放入SQL查询中?

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

如果在“自定义”表中存在具有相同键的值是什么在参考表中的记录,然后采取“习俗”。否则,取参考值。

我想也许我可以使用RIGHT JOIN,或者甚至可以使用UNION运算符来控制返回的内容。我一直在争论SQL的逻辑。 JOIN将从一个表中获取信息与另一个表中的信息进行连接,这是我真正不需要的。 UNION将简单地移除表格之间的重复...,这很接近。

喜欢的东西:

SELECT * FROM定制UNION SELECT * FROM参考

除了这只会下降重复,如果所有列是相同的。如果有任何不同(这将是自定义条目存在的原因),那么UNION除了将两个表格的内容混合在一起外什么都不做。

我对这一切都错了吗?

感谢您提供的任何见解。

回答

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) 
+0

因此,从两个表中获取所有记录,然后在where子句中尝试过滤出结果集中具有其自定义表中的键的记录。对?这是否意味着最终结果集将缺少其自定义表中存在键值的记录? – Raevik 2012-07-12 20:40:53

+0

Wellll,有点。我的自定义表有一个额外的主键列,这意味着技术上可能会有多个自定义记录,并且具有与参考表中的一条记录相同的keyVal。 – Raevik 2012-07-12 20:43:20

+0

Where子句适用于每个单独的选择,而不是整个联合查询。尽管如此,一个'order by'可能会结束整个事情。 – 2012-07-12 20:46:03

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' 
+0

我的SQL-foo是谦虚的。我想你只是让我的大脑爆炸了。我会开始使用Google。 – Raevik 2012-07-12 20:41:31

+0

我重新读你的问题,我不明白你的表是如何相关的,因为你提到了一个只在自定义表中的两部分键。我还看到你在联合和工会之间的困惑。 Lossely,加入水平结合表和联合垂直结合。 – shawnt00 2012-07-12 20:46:48

+0

有许多用户对这些数据进行“项目”处理。定制表保存参考数据的所有更新/新记录的条目。因此,ID,项目的组合键。参考表没有项目列。 – Raevik 2012-07-12 20:52:30

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的不支持这种类型的功能。