我有以下 table1,其中有一个 id
可以出现多次,每次都有一个独特的 name
name
也一样, 它可能会出现多次并且每次都有不同的 id
.
id name
---------
A2 B6
A3 B2
A3 B400
A5 B100
A7 B200
A8 B300
A8 B2
A8 B3
这里是 table2,其中所有 id
table1 中的 s 存在,但不是所有的 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
查询结果如下:
- 第一列:所有独特的列表 id
来自 table1 加上所有 name
的列表table1 中的 s 在 name
中找不到table2 的列。
- 第二列:surname
id
中的每个元素结果表的列取自 table2,所有 id
table1 中的 s 具有相应的姓氏,但如果 name
从table1中找不到table2,那么我们把相同的name
作为姓氏。
- 第三列:如果id
或 name
从 table1 在 table2 中找到,则状态将为 FOUND,但是如果 name
来自 table1 未找到,它将得到 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
最佳答案
这称为左连接。以下是如何将其应用于您的问题:
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
关于mysql - sql连接两个表并从一个表中获取基于另一个表的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228450/