![](/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.