我是SQL的新手.我有两张桌子]

表1:

id   product  location
1    banana    costco
2    apple     walmart
3    lemons    target

表2:

id
1
2
4

我想根据id加入这两个表.如果存在匹配项,我希望在结果表中创建一个新列,使我的结果如下所示

id   flag
1    true
2    true 
3    false
4    true

也就是说,如果ID存在于表2中,我想将其标记为True,否则标记为False.我希望在结果表中包括所有ID

我如何在SQL(在雅典娜中运行)中做到这一点?

我可以通过关注加入,但我不知道根据匹配创建专栏

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;

Select 匹配项、缺少的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;

UPDATE:我刚看到你给MySQL和Amazon Athena都加了标签.这是两个不同的数据库管理系统.MySQL不支持完全外连接,而Athena支持.因此,对于Athena来说,所有三个查询都应该可以,而对于MySQL,只有第二个和第三个查询可以.

Sql相关问答推荐

Oracle SQL-将结果列在单行中

SQL子查询返回多个值错误

如何计算一个用户S的日常连胜?

有没有办法在Postgres中存储带有时区的时间戳,而不将其转换为UTC

返回UPSERT中的旧行值

根据最大值为字母数字大小写分配数值

如何为该查询编写正确分区依据

对于多字节字符,SQL Server中的DATALENGTH返回1字节

使用特定的Order By子句随机化SQL输出

从重复值中获取最新值

Select 一个非零值减少重复

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

Postgres存在限制问题「小值」

Clob 问题 - 将 clob 列拆分为多行

函数调用作为插入值语句中的参数

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

将单行中的多个行值转换为列

pyspark 将列转换为行

从 JSON 数组中移除对象

如何在 Trino/Presto 中过滤掉 map 中的某些键?