我是 SQL 新手。我有 2 张 table ]
表 1:
id product location
1 banana costco
2 apple walmart
3 lemons target
表 2:
id
1
2
4
我想根据 id 连接这 2 个表。如果存在匹配项,我想在结果表中创建一个新列,以便我的结果如下所示
id flag
1 true
2 true
3 false
4 true
即,如果 id 存在于 table2 中,我想将其标记为 true,否则标记为 false。我想在结果表中包含所有 id
如何在 SQL 中执行此操作(在 Athena 中运行)?
我可以通过以下方式加入,但我不知道如何根据匹配创建列
SELECT t2.id from table2 t2,
LEFT JOIN table1 t1 ON t1.id=t2.id
最佳答案
您正在寻找的是完全外连接,但 MySQL 是极少数不支持完全外连接的 RDBMS 之一。
完整的外部联接如下所示:
SELECT
COALESCE(t1.id, t2.id) AS id,
(t1.id IS NOT NULL AND t2.id IS NOT NULL) AS flag
FROM table1 t1
FULL OUTER JOIN table2 t2 ON t2.id = t1.id
ORDER BY COALESCE(t1.id, t2.id);
这里有两种替代方法:
收集所有ID,然后检查它们是否存在于两个表中:
SELECT
id
id IN (SELECT id FROM table1)
AND
id IN (SELECT id FROM table2) AS flag
FROM
(
SELECT id FROM table1
UNION
SELECT id FROM table2
) ids
ORDER BY id;
选择匹配项、缺失的 table2 ID 和缺失的 table1 ID,然后合并这些结果。
SELECT id, true AS flag FROM table1 JOIN table2 USING (id)
UNION ALL
SELECT id, false AS flag FROM table1 WHERE id NOT IN (SELECT id FROM table2)
UNION ALL
SELECT id, false AS flag FROM table2 WHERE id NOT IN (SELECT id FROM table1)
ORDER BY id;
更新:我刚刚看到您标记了 MySQL 和 Amazon Athena。这是两个不同的 DBMS。 MySQL 不支持完全外连接,Athena 支持。因此,对于 Athena,所有三个查询都应该有效,而对于 MySQL,只有第二个和第三个查询可以。
关于sql - 在 SQL 中连接 2 个表并根据匹配创建一个标志列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75116488/