![](/img/trans.png)
[英]SQL - Join two tables and conditionally select rows based on value from a categorical column
[英]Join 2 tables in SQL and create a flag column based on a match
我是SQL的新手。我有2张桌子]
表格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 存在于 table2 中,我想标记为 true 否则为 false。 我想在结果表中包含所有 id
我怎样才能在 SQL(在 Athena 中运行)中执行此操作?
我可以通过关注加入,但我不知道如何根据匹配项创建列
SELECT t2.id from table2 t2,
LEFT JOIN table1 t1 ON t1.id=t2.id
尝试使用UNION
:
SELECT
id,
true AS flag
FROM
table2
UNION
SELECT
id,
false AS flag
FROM
table1
WHERE
id NOT IN (
SELECT id FROM table2
)
SELECT id, CASE WHEN id in (SELECT id FROM table2) THEN 'true' ELSE 'false' END AS 'flag' FROM table1 UNION SELECT id, CASE WHEN EXISTS (SELECT 1 FROM table2) THEN 'true' ELSE 'false' END AS 'flag' FROM table2;
您正在寻找的是完全外部联接,但 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;
更新:我刚刚看到您同时标记了 MySQL 和 Amazon Athena。 这是两个不同的 DBMS。 MySQL 不支持全外连接,Athena 支持。 因此,对于 Athena,所有三个查询都应该有效,而对于 MySQL,只有第二个和第三个查询有效。
Select
(case when table1.id is null then table2.id else table1.id end) as id,
(case when table2.id is null then false else true end) as flag
from table1 full join table2
on table1.id = table2.id
full join 将帮助您获得所有 id,在选择中您可以使用 case 语句来避免在 id 和 flag 列中选择空值。
您可以按如下方式进行:
select t2.id, 'true' as flag
from table2 t2
union
select id, 'false' as flag
from table1
where id not in ( select id from table2)
由于 table2 中的所有 id 必须为true
,而其他不在 table2 中的必须为false
,因此不需要连接。
您可以从这里尝试: https://dbfiddle.uk/QIPoFRTb
这是为了让他们订购:
select *
from (
select t2.id, 'true' as flag
from table2 t2
union
select id, 'false' as flag
from table1
where id not in ( select id from table2)
) as s
order by id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.