繁体   English   中英

加入 SQL 中的 2 个表并根据匹配创建标志列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM