当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匹配多行时,如何从一个表中选择行?的主要内容,如果未能解决你的问题,请参考以下文章
当查询返回多个 min(count) 数据时,如何从不同表中选择所有行