【发布时间】:2014-10-21 20:02:10
【问题描述】:
我有 2 张桌子; tblORIG 拥有所有数据,而 tblNEW 有一些更新的数据仍在等待批准,因此我无法合并或更新。
我想返回 tblNEW 行,但如果没有 NEW 结果,我想返回 tblORIG 行。
我创建了一个 UNION ALL 作为 FROM 子查询,并将 tblORIG 的排名设为 2,将 NEW 的排名设为 1。起初我认为完美我将只选择我的字段和一个 MIN(RANK)。这不起作用,因为字段有时不同,并且 Group By 会返回所有内容。
当前项目适用于 MSAccess(叹气),但我想知道 access 或 MySQL 或 Oracle 中的答案。
这里有一些简化的代码来解释这个问题。
SELECT U_TBL.NAME1, U_TBL.NAME2, MIN(RANK_VAL)
FROM
(SELECT tblORIG.NAME1, tblORIG.NAME2, 2 AS RANK_VAL FROM tblORIG
UNION ALL
SELECT tblNEW.NAME1, tblNEW.NAME2, 1 AS RANK_VAL FROM tblNEW) AS U_TBL
GROUP BY U_TBL.NAME1, U_TBL.NAME2
我不能使用 Group by 因为 Name1 和 Name2 在每个表中彼此不同。他们有Account_ID,是的,他们是一样的。 tblNEW 将始终在 tblORIG 中有记录,但 tblORIG 有时只会在 tblNEW
我也会为问题的更好标题提出建议。
【问题讨论】:
-
我认为您需要使用外连接将两个表连接在一起。然后你可以使用 coalesce(或者你选择的任何平台。我认为在 Access 中你可以使用
NZ.)。类似于select coalesce(tblNew.col1,tblOld.col1)... from tableOld left outer join tableNew on...。 -
什么是主键? Account_ID?
-
@PederRice 是的,两个表都有 ID。我猜它会被称为 ORIG.KUNNR 和 NEW.KUNNR。是的,它是 SAP 数据。如果表是新的,它也是旧的。新表是我清理旧数据。该项目是为了让其他团队对其进行验证。