簡體   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