2 个表上的 FULL OUTER JOIN(或 UNION)

FULL OUTER JOIN (or UNION) on 2 tables

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

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

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

第二个table“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 

感谢您的帮助。

假设如下:

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

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

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

我假设您在找到匹配行时需要 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