【问题标题】:sql join two tables and get the unique values from one table based on anothersql连接两个表并根据另一个表从一个表中获取唯一值
【发布时间】:2016-12-19 18:02:07
【问题描述】:

我有以下 table1,其中 id 可能出现多次,每次都有一个唯一的 namename 相同,它可能出现多次,每个时间与不同的id

id  name
---------
A2  B6
A3  B2
A3  B400
A5  B100
A7  B200
A8  B300
A8  B2
A8  B3

这是 table2,其中存在来自 table1 的所有 ids,但不是所有 names。每个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 中所有唯一 ids 的列表加上 table1 中未在name table2 的列。 - 第二列:取自table2的结果表id列中每个元素的surname,所有来自table1ids都有一个对应的姓氏,但是如果 table2 中没有找到 table1 中的name,那么我们将相同的name 放入姓氏。 - 第三列:如果在 table2 中找到来自 table1idname,则状态将为 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

【问题讨论】:

  • 你可以使用left join
  • 这一行没有意义——A2 Lastname2 FOUND——“允许”这一行被发现的规则是什么?
  • 这有点令人费解。您可能希望首先避免使用列描述符id。我们大多数人会认为id 是独一无二的,而AUTO_INCREMENT。接下来,为表提供关于它们所代表内容的描述性名称,而不是“table1”“table2”。即使使用名称作为名称也可能有点混乱。
  • @Hogan 第 1 行是“找到”的,因为表 1 中的 ID 或 NAME(表 1 的第 1 行第 1 列是 A2)​​是“在表 2 中找到的”(在表 2 的 id 列中某处)。

标签: mysql sql


【解决方案1】:

这称为左连接。以下是如何将其应用于您的问题:

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 

【讨论】:

  • 对于初学者来说,OP 匹配 table1.nametable2.id,事情离题了。
  • 不知道你的意思@ebyrob - 这不是问题中显示的内容。 ids 都以“A”开头,名字以“B”开头,所以这样的匹配是不可能的。
  • 阅读所需结果的描述。第一列是第一个表中所有名称和 ID 的列表。稍后:“如果在 table2 中找到 table1 的 id 或 name”,然后 FOUND 等。
  • @ebyrob -- 规则和示例有点混乱,这意味着两件事之一 -- a) 我不理解规则,一旦理解它们就有意义 b) 我不明白这些规则是因为它们不可能在真实系统中实际实施,或者 c) 它们的解释很糟糕,但是每个人在使用 SQL 时总是想做的事情是一样的。我假设“C”——我可能错了,我以前错了。
  • 我很确定,在这种情况下,它绝对不是 C。请参阅此处的交叉帖子:stackoverflow.com/questions/41244823/… 结果集经过精心设计,至少与一些复杂的逻辑相匹配。我唯一不确定的是 OP 是在尝试实现一些有用的东西,还是只是在玩一种扭曲的代码高尔夫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2010-10-24
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多