【问题标题】:FULL OUTER JOIN (or UNION) on 2 tables2 个表上的 FULL OUTER JOIN(或 UNION)
【发布时间】:2022-01-27 16:26:59
【问题描述】:

我遇到了 SQL 请求问题。我不是 SQL 专家,我想了解我的错误。 我的用例是获取第一个表的所有记录 + 第一个表中不存在的第二个表的记录。 我有两张这样的桌子:

第一个表“T-Finance par jalon ZOHO”(有 20 列):

Num_Affaire, Nom_Jalon, Montant, ...
21021287,APD,3000
21021287,APS,5000
21021287,DCE,10000

第二张表“T-Finance par jalon EVERWIN”(20列):

Num_Affaire_GX, Phase_GX, Montant_GX, ...
21021287,APS,5000
21021287,DCE,10000
21021287,ACT,50000

想要的结果是:

Num_Affaire, Phase, Montant, ...
21021287,APD,3000
21021287,APS,5000
21021287,DCE,10000
21021287,ACT,50000

所以我认为完全外部联接是解决方案,但我不知道为什么它不能像参加的那样工作。 我尝试了很多东西,但记录 (21021287, ACT, 50000) 从未出现在最终结果中。

这是我尝试过的请求之一:

SELECT *
FROM  "T-Finance par jalon ZOHO" AS  zoho
FULL OUTER JOIN "T-Finance par jalon EVERWIN" gx ON gx.Num_Affaire_GX  = zoho.Num_Affaire
     AND    gx.Phase_GX  = zoho.Nom_Jalon  
WHERE    is_startswith(zoho.Nom_Jalon, 'Validation - ')  = 0

我也尝试使用 UNION 并且它可以工作,但问题是我不知道如何获取每行的所有其他信息(列)。因为如果我将其他列添加到 SELECT 语句中,UNION 将不会检测到重复:

SELECT
         min(mix.Num_Ligne),
         mix.Num_Affaire,
         mix.Phase
FROM (  SELECT
             zoho.Num_Ligne as Num_Ligne,
             to_string(zoho.Num_Affaire) as Num_Affaire,
             to_string(zoho.Nom_Jalon) as Phase
    FROM  "T-Finance par jalon ZOHO" AS  zoho 
    UNION
    SELECT
             gx.Num_Ligne_GX as Num_Ligne,
             to_string(gx.Num_Affaire_GX) as Num_Affaire,
             to_string(gx.Phase_GX) as Phase
    FROM  "T-Finance par jalon EVERWIN" gx 
 
) mix 
WHERE    is_startswith(mix.Phase, 'Validation - ')  = 0
GROUP BY 2,
      3 

感谢您的帮助。

【问题讨论】:

  • 每张表的主键是哪一列?

标签: sql database join union zoho


【解决方案1】:

我假设您在找到匹配行时希望最小值为 Num_Ligne。完全加入版本,前提是您的 DBMS 支持 least。否则,您可以使用 CASE 表达式来完成。

SELECT coalesce(gx.Num_Affaire_GX, zoho.Num_Affaire) Num_Affaire
     , coalesce(gx.Phase_GX, zoho.Nom_Jalon) Phase
     , least(gx.Num_Ligne, zoho.Num_Ligne) Num_Ligne
FROM  "T-Finance par jalon ZOHO" AS  zoho
FULL OUTER JOIN "T-Finance par jalon EVERWIN" gx ON gx.Num_Affaire_GX  = zoho.Num_Affaire
       AND  gx.Phase_GX  = zoho.Nom_Jalon  
WHERE  is_startswith(coalesce(gx.Phase_GX, zoho.Nom_Jalon), 'Validation - ')  = 0

【讨论】:

  • 有效!我的错误是什么?问题是因为我没有合并列?非常感谢。你对我的第二个问题有答案吗?有问题吗?
  • @A.Dumas ,您是说 UNION 的问题吗?
  • 是的,这个!!
【解决方案2】:

假设如下:

  1. 两个表的列完全相同
  2. 仅保证整行的唯一性(即没有主键)
  3. 每个表中的每一行都是唯一的,重复只存在于整个行中

您唯一的选择是子查询和DISTINCT

SELECT DISTINCT * FROM (
    SELECT * FROM "T-Finance par jalon ZOHO"
    UNION 
    SELECT * FROM "T-Finance par jalon EVERWIN"
) tbl

【讨论】:

  • 抱歉,我忘记在 eache 表中指定 Num_Ligne 列(自动编号)。感谢您的回答,我会检查这个以了解发生了什么,以及我必须做什么。
  • 那么“重复”是什么意思,是指具有相同“Num_Ligne”值的行吗?或者其他所有值都相同除了“Num_Ligne”的行?
  • 在这种情况下,第一个表的主键是 (Num_Affaire, Nom_Jalon),第二个表是 (Num_Affaire_GX, Phase_GX)。
  • 1 - 两个表都有完全相同的列:这意味着这是一个问题吗?最佳做法是什么?
猜你喜欢
  • 2017-08-12
  • 2013-04-16
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2018-02-28
  • 2013-03-10
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多