sql连接两个表并从一个表中获取基于另一个表的唯一值

时间:2016-12-19 18:02:07

标签: mysql sql

我有以下 table1 ,其中id可能多次出现,每次都有唯一的namename也是如此,可能会出现多次,每次都有不同的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 中的idname,则状态将为 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

1 个答案:

答案 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