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

时间:2017-05-02 16:23:30

标签: sql oracle

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

(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中的行?感谢

更新:好的,我有第3张桌子......

(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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

有很多方法可以做到。

如果你在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

<强>更新

您可以将GROUP BY用于WITH子句。

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