Mysql SQL两个表需要根据联合中的列组从任一表返回值
我有两张桌子;tblORIG拥有所有数据,tblNEW拥有一些更新的数据,这些数据仍在等待批准,因此我无法合并或更新 我想返回tblNEW行,但如果没有新结果,我想返回tblORIG行 我创建了一个联合ALL作为FROM子查询,并将tblORIG的秩设为2,新的秩设为1。起初我觉得很完美,我只需要选择我的字段和一个最小值(排名)。这不起作用,因为字段有时不同,Group By返回所有内容 当前项目适用于MSAccess(叹气),但我想知道access、MySQL或Oracle中的答案 下面是一些简化的代码来解释这个问题Mysql SQL两个表需要根据联合中的列组从任一表返回值,mysql,sql,ms-access,Mysql,Sql,Ms Access,我有两张桌子;tblORIG拥有所有数据,tblNEW拥有一些更新的数据,这些数据仍在等待批准,因此我无法合并或更新 我想返回tblNEW行,但如果没有新结果,我想返回tblORIG行 我创建了一个联合ALL作为FROM子查询,并将tblORIG的秩设为2,新的秩设为1。起初我觉得很完美,我只需要选择我的字段和一个最小值(排名)。这不起作用,因为字段有时不同,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
我不能使用分组依据
,因为每个表中的名称1和名称2彼此不同。他们有账号,是的,他们是一样的tblNEW将始终在tblORIG中有记录,但tblORIG有时只在tblNEW中有记录
我也会采纳一些关于这个问题更好的标题的建议 试试这个:
SELECT tblNEW.NAME1, tblNEW.NAME2, 1 AS RANK_VAL FROM tblNEW
UNION ALL
SELECT tblORIG.NAME1, tblORIG.NAME2, 2 AS RANK_VAL
FROM tblORIG
WHERE NOT EXISTS (SELECT 1 FROM tblNEW WHERE NAME1 = tblORIG.NAME1 AND NAME2 = tblORIG.NAME2)
这应该适用于MySQL。不确定访问权限。您对MIN的想法是正确的,但这需要通过一个子选择来完成。比如:
SELECT
*
FROM
(
SELECT ID, 1 AS Rank FROM A
UNION ALL
SELECT ID, 2 AS Rank FROM B
) AllItems
JOIN
(
SELECT
ID,
MIN(Rank) AS MinRank
FROM
(
SELECT ID, 1 AS Rank FROM A
UNION ALL
SELECT ID, 2 AS Rank FROM B
) Ranks
GROUP BY
Ranks.ID
) LowestItems
ON AllItems.ID = LowestItems.ID
AND AllItems.Rank = LowestItems.Rank
希望您能将其应用于您的具体情况。我认为您需要使用外部联接将两个表联接在一起。然后你可以使用coalesce(或者你选择的任何平台,我认为在Access中你可以使用
NZ
)。类似于selectcoalesce(tblNew.col1,tblOld.col1)。。。从tableOld左侧外部联接tableNew on…
。主键是什么?帐户ID?@PederRice是的,两个表都有ID。我猜它会被称为ORIG.KUNNR和NEW.KUNNR。是的,这是SAP数据。如果表格是新的,它也是旧的。新表正在清理旧数据。该项目是这样的,我可以让其他团队对其进行验证。从和AllItems.Rank=lowsitems.Rank
到和AllItems.Rank=lowsitems.MinRank
的小修改让它开始工作。这并不快,但这比什么都重要。谢谢你的帮助!我无法使它在Access中工作,但如果我在更好的DB系统中遇到此问题,我会将此方法放在手边。非常感谢。