进行查询以根据条件合并两个 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这里可能是以下内容:
- 获取表2中存在但[=24]的所有行(匹配条件“日期”和“国家/地区”) =]表1中没有.
- 获取表 1 中存在 但 [=24] 的所有行(匹配条件“日期”和“国家/地区”) =]表2中没有.
- 获取存在于 table2 和 table1 中的所有行(匹配条件“日期”和“国家/地区”),但取行 仅来自表 2.
- 把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
我有两个 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这里可能是以下内容:
- 获取表2中存在但[=24]的所有行(匹配条件“日期”和“国家/地区”) =]表1中没有.
- 获取表 1 中存在 但 [=24] 的所有行(匹配条件“日期”和“国家/地区”) =]表2中没有.
- 获取存在于 table2 和 table1 中的所有行(匹配条件“日期”和“国家/地区”),但取行 仅来自表 2.
- 把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