sql - 在 SQL 中连接 2 个表并根据匹配创建一个标志列

标签 sql amazon-athena

我是 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/

相关文章:

sql - 如何从 tableA 中选择 *,其中 columnA 值不以字母 'F' 开头

java - 列名称中包含 "é"的 iSeries JDBC Sql 语句抛出 java.sql.SQLException : [SQL0104]

prepared-statement - 如何在 Athena 中将准备好的语句与 boto3 结合使用?

amazon-athena - 在 Amazon Athena 中按顺序显示分区

java.lang.BootstrapMethodError : call site initialization exception from Athena java class

python - 在 AWS Lambda 函数上执行 Python 脚本时出现问题

php - 随机排序php数组

sql - 获取不带 NULL 值的 SQL 不同行

创建表时出现 MySQL 错误 1005

amazon-web-services - HIVE_CURSOR_ERROR : Please reduce your request rate