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
感谢您的帮助。
假设如下:
- 两个 table 具有完全相同的列
- 只保证整行的唯一性(即没有主键)
- 每个 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
我遇到了 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
感谢您的帮助。
假设如下:
- 两个 table 具有完全相同的列
- 只保证整行的唯一性(即没有主键)
- 每个 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