当join匹配多行时,如何从一个表中选择行?

Posted

技术标签:

【中文标题】当join匹配多行时,如何从一个表中选择行?【英文标题】:How to select rows from one table, when join matches multiple rows? 【发布时间】:2017-05-02 16:23:29 【问题描述】:

场景如下:我有这两张表:

(TABLE1)
SUPER_ID| NAME |
-------+--
1 | BOB  |


(TABLE2)
ID| SUPER_ID |
-------+----+
1 | 1       |
2 | 1       |
3 | 1       |

如果我将这两个表加入为

`SELECT a.super_id, a.name 
   FROM TABLE1 a LEFT OUTER JOIN TABLE2 b ON a.super_id = b.super_id 
  WHERE a.super_id = 1`

结果是

SUPER_ID| NAME |
-------+--------
1       | BOB  |
1       | BOB  |
1       | BOB  |

如何在不使用 GROUP BY 的情况下仅选择 TABLE1 中的行?谢谢

更新:好的,所以我有第三张桌子......

(TABLE3)
ID| TYPE |
-------+----+
1 | A       |
2 | B       |
3 | C       |

我需要加入 TABLE2 AS:

SELECT a.super_id, a.name 
  FROM TABLE1 a INNER JOIN 
       TABLE2 b ON a.super_id = b.super_id INNER JOIN
       TABLE3 c ON b.id = c.id
 WHERE a.super_id = 1

【问题讨论】:

TABLE2和TABLE3是什么关系? 1:米?纽:米?请发布一些数据。以供将来参考,请以最小但完整的方式提出您的问题。反复提取细节和细化只会浪费大家的时间。 请花几分钟时间了解联接及其工作原理:blog.codinghorror.com/a-visual-explanation-of-sql-joins,因为您想联接 3 个表...您的预期结果集是什么样的? 感谢您的回复@xQber;我设法通过在 FROM 子句中使用子查询来完成我的请求;正如@Charles Bretana 所建议的那样。我试图根据 TAABLE1 限制我的结果集,无论 TABLE2 中有多个匹配项 【参考方案1】:

通过基于其他一些 [唯一] 标准来限制连接。当然,SQL 语法取决于您选择的其他标准。假设您要输入最新记录,如果表有时间戳列,您可以这样做:

SELECT a.super_id, a.name 
FrOM TABLE1 a LEFT JOIN TABLE2 b 
  ON b.super_id = a.super_id 
     and b.timestamp = (Select Max(timestamp)
                        From TABLE2 
                        Where super_id = a.super_id)
WHERE a.super_id = 1

如果您没有时间戳,但您有唯一索引或键(看起来像 id 就是这样),您可以使用它:

SELECT a.super_id, a.name 
FrOM TABLE1 a LEFT JOIN TABLE2 b 
  ON b.super_id = a.super_id 
     and b.id= (Select Max(id)
                From TABLE2 
                Where super_id = a.super_id)
WHERE a.super_id = 1

【讨论】:

谢谢;我最终使用了你的方法(第一个)。我没有使用 Max(),而是使用了 DISTINCT() 并且可以工作!【参考方案2】:

有很多方法可以做到这一点。

如果您在 table2 中有 super_id,我假设您想要 table1 中的行。

你可以使用 EXISTS

SELECT a.super_id, a.name 
FROM TABLE1 a 
WHERE EXISTS ( SELECT NULL FROM table2 b WHERE a.super_id = b.super_id )
AND a.super_id = 1

更新

您可以在 WITH 子句中使用 GROUP BY。

WITH single_b AS ( SELECT super_id, name 
                   FROM table2
                   GROUP BY super_id, name )
SELECT a.super_id, a.name 
FROM TABLE1 a INNER JOIN single_b b ON a.super_id = b.super_id 
              INNER JOIN TABLE3 c ON b.super_id = c.id
WHERE a.super_id = 1 

【讨论】:

感谢您的回复。问题是我需要将第三个表(TABLE3)作为 INNER JOIN TABLE3 c ON b.ID = c.ID...

以上是关于当join匹配多行时,如何从一个表中选择行?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Query Join 从两个表中选择不匹配的行

当查询返回多个 min(count) 数据时,如何从不同表中选择所有行

从 LEFT JOIN 中选择最大的行

MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

当存在 NULL 时,性能选择与另一个表中的条目不匹配的行

根据日期检查来自同一表的记录,其中包含多行中的不匹配值