进行查询以根据条件合并两个 table,并优先考虑第二个 table 中的行

Making a query to merge two tables upon criteria, with giving priority to the rows from the second table

我有两个 MS Access table。

table1
ID  Country     Dat         Val
1   Australia   01.10.2021  10
2   Canada      01.10.2021  100
3   Japan       01.10.2021  1000
4   Australia   02.10.2021  20
5   Canada      02.10.2021  200
6   Japan       02.10.2021  2000

table2
ID  Country     Dat         Val
1   Canada      01.10.2021  50000
2   Greece      01.10.2021  50100
3   Canada      02.10.2021  60000
4   Greece      02.10.2021  60100

这个 SQL 代码允许我 合并两个 tables,它给出 10 行。

   SELECT table2.Dat,
          table2.Country,
          table2.Val
     FROM table2
LEFT JOIN table1
       ON (table1.Dat = table2.Dat)
      AND (table1.Country = table2.Country)

UNION ALL

   SELECT table1.Dat,
          table1.Country,
          table1.Val
     FROM table1
LEFT JOIN table2
       ON (table1.Dat = table2.Dat)
      AND (table1.Country = table2.Country)

 ORDER BY table2.Dat,
          table2.Country;

它会根据“日期”和“国家/地区”条件提供重复项。

问题

我想知道,如果我想以某种方式合并两个 table,如果 table1 和 table2 具有相同的“日期”和“国家/地区”,那么将选择 table2 行,而不是两者?

换句话说,如何从 table1 和 table2 中获取 所有 不匹配的唯一行 条件“日期”和“国家/地区”,并在两个 table2 when 行中给予 优先级 =55=]s 匹配 条件“日期”和“国家/地区”?

(“日期 + 国家/地区”捆绑包在每个 table 中是唯一的,即一个 table 中只有一个“数据 + 国家/地区”)

换句话说,我可以使用什么查询来使结果看起来像这样,即 8 行没有重复的日期和国家/地区?

Expected Result
Dat         Country     Val
01.10.2021  Australia   10
01.10.2021  Canada      50000
01.10.2021  Greece      50100
01.10.2021  Japan       1000
02.10.2021  Australia   20
02.10.2021  Canada      60000
02.10.2021  Greece      60100
02.10.2021  Japan       2000

什么是制作 此类 SQL 脚本的好方法table,以根据类似的几个标准合并 tables?

基本的方法就是将这些任务拆分成sub-tasks。

较小的,因此更容易,sub-tasks这里可能是以下内容:

  1. 获取表2中存在但[=24]的所有行(匹配条件“日期”和“国家/地区”) =]表1中没有.
  2. 获取表 1 中存在 但 [=24] 的所有行(匹配条件“日期”和“国家/地区”) =]表2中没有.
  3. 获取存在于 table2 和 table1 中的所有行(匹配条件“日期”和“国家/地区”),但取行 仅来自表 2.
  4. UNION ALL放在parts[=47之间=] 您之前已经创建并测试过(以确保一切正常)。

因此,这里有一个可能的直接解决方案:

   SELECT table2.Dat,
          table2.Country,
          table2.Val
     FROM table2
LEFT JOIN table1
       ON (table1.Country = table2.Country)
      AND (table1.Dat = table2.Dat)
    WHERE table1.Country IS NULL
      AND "comment: Getting from table2 everything that is absent in table1 (matching country and date criteria)"

UNION ALL

   SELECT table1.Dat,
          table1.Country,
          table1.Val
     FROM table1
LEFT JOIN table2
       ON (table1.Country = table2.Country)
      AND (table1.Dat = table2.Dat)
    WHERE table2.Country IS NULL
      AND "comment: Getting from table1 everything that is absent in table2 (matching country and date criteria)"

UNION ALL

   SELECT table2.Dat,
          table2.Country,
          table2.Val
     FROM table2,
          table1
    WHERE table1.Country = table2.Country
      AND table1.Dat = table2.Dat
      AND "comment: getting from table2 everything that exists in table1 (matching country and date criteria)"

 ORDER BY table2.Dat,
          table2.Country;

结论

所以这里的问题就是从“重叠集合”中取出相应的行,然后合并它们。

要了解更多,您可以看看 Venn diagram and some other answers here (SO) or non-Venn way explanation here

您只需要 UNION ALL 用于 2 个表并在 WHERE 子句中使用 NOT EXISTS 用于 table1:

SELECT t1.Dat, t1.Country,  t1.Val FROM table1 AS t1
WHERE NOT EXISTS (SELECT 1 FROM table2 AS t2 WHERE t2.Country = t1.Country AND t2.Dat = t1.Dat)
UNION ALL
SELECT Dat, Country, Val FROM table2
ORDER BY Dat, Country

结果:

Dat         Country     Val
1/10/2021   Australia   10
1/10/2021   Canada      50000
1/10/2021   Greece      50100
1/10/2021   japan       1000
2/10/2021   Australia   20
2/10/2021   Canada      60000
2/10/2021   Greece      60100
2/10/2021   Japan       2000