我有以下 table1 ,其中id
可能多次出现,每次都有唯一的name
,name
也是如此,可能会出现多次,每次都有不同的id
。
id name
---------
A2 B6
A3 B2
A3 B400
A5 B100
A7 B200
A8 B300
A8 B2
A8 B3
这里是 table2 ,其中 table1 的所有id
都存在,但并非所有name
都存在。每个id
都有surname
。
id name surname
-------------------
A1 Lastname1
A2 Lastname2
A3 B1 Lastname3
A4 Lastname4
A5 B2 Lastname5
A6 Lastname6
A7 B3 Lastname7
A8 B4 Lastname8
A9 Lastname9
A10 B6 Lastname10
这是查询结果:
- 第一列: table1 中所有唯一id
的列表,加上 table1 中所有name
的列表在 table2 的name
列中找不到。
- 第二列:结果表surname
列中每个元素的id
取自 table2 , table1中的所有id
有相应的姓氏,但如果在 table2 中找不到 table1 中的name
,那么我们会使用相同的name
作为姓氏。
- 第三列:如果在 table2 中找到 table1 中的id
或name
,则状态将为 FOUND ,但如果找不到 table1 中的name
,则会获得 NOT FOUND
id surname status
---------------------------
A2 Lastname2 FOUND
A3 Lastname3 FOUND
A5 Lastname5 FOUND
A7 Lastname7 FOUND
A8 Lastname8 FOUND
A10 Lastname10 FOUND
B100 B100 NOT FOUND
B200 B200 NOT FOUND
B300 B300 NOT FOUND
B400 B400 NOT FOUND
答案 0 :(得分:0)
这称为左连接。以下是如何将其应用于您的问题:
SELECT table1.id, coalesce(table2.surname, table1.name) as surname,
case when table2.id is null then 'not found' else 'found' end as status
FROM table1
LEFT JOIN table2 on table1.id = table2.id and table1.name = table2.name
正如@ebyrob所指出的,你不希望第一列中的id为非匹配:
SELECT
case when table2.id is null then table1.name else table1.id end as id,
coalesce(table2.surname, table1.name) as surname,
case when table2.id is null then 'not found' else 'found' end as status
FROM table1
LEFT JOIN table2 on table1.id = table2.id and table1.name = table2.name