【问题标题】:SQL Two tables need to return values from either table based on a rank in a unionSQL 两个表需要根据联合中的排名从任一表返回值
【发布时间】: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 数据。如果表是新的,它也是旧的。新表是我清理旧数据。该项目是为了让其他团队对其进行验证。

标签: mysql sql ms-access


【解决方案1】:

您对 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

希望您可以将其应用于您的具体情况。

【讨论】:

  • AND AllItems.Rank = LowestItems.RankAND AllItems.Rank = LowestItems.MinRank 的小修改我让它工作了。它并不快,但这比 Access 更重要。感谢您的帮助!
【解决方案2】:

试试这个:

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。不确定 Access。

【讨论】:

  • 我无法让它在 Access 中工作,但如果我在更好的数据库系统中遇到此方法,我会保留此方法。谢谢。
猜你喜欢
  • 2022-12-17
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2016-06-18
相关资源
最近更新 更多