I’m facing a SQL request issue. I’m not a SQL expert and I would like to understand my mistakes. My use case is to get all records of the first table + records of the second table that are not present in the first table. I’ve got 2 tables like this :
First table “T-Finance par jalon ZOHO” (with 20 columns):
Num_Affaire, Nom_Jalon, Montant, ... 21021287,APD,3000 21021287,APS,5000 21021287,DCE,10000
Second table “T-Finance par jalon EVERWIN” (with 20 columns):
Num_Affaire_GX, Phase_GX, Montant_GX, ... 21021287,APS,5000 21021287,DCE,10000 21021287,ACT,50000
Wanted result is :
Num_Affaire, Phase, Montant, ... 21021287,APD,3000 21021287,APS,5000 21021287,DCE,10000 21021287,ACT,50000
So I suppose a full outer join is the solution but I don’t know why it does not work as attended. I tried a lot of things but record (21021287, ACT, 50000) is never present in final result.
here is one of the request I tried:
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
I also tried with a UNION and it works but the problem is I don’t know how to get all others informations (columns) of each row. Because if I add others columns into SELECT statement, UNION will not detect duplicates :
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
Thanks for your help.
Advertisement
Answer
I assume you want minimum value of Num_Ligne
when matching rows are found. Full join version, provided your DBMS supports least
. Otherwise you can do it with a CASE expression.
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