连接表并选择一个到一个的值

时间:2016-07-12 14:38:38

标签: sql oracle left-join

我需要一个包含两个表的连接,但可能存在多个匹配

t1              t2
A   B           A   C
1   x           1   0
2   x           1   1
3   x           2   0
4   x           3   1
5   x           4   1
6   x           4   0
                5   0
                6   1

现在我需要一个来自t1和t2的左连接选项,如果有一个C 0和一个选中的A,那么C必须是0 (for A=1 and A=4)

所以结果应该是:

t3     
A   B   C  
1   x   0  
2   x   0  
3   x   1  
4   x   0  
5   x   0  
6   x   1  

这可能吗? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式进行加入和分组:

SELECT t1.a,t1.b,MIN(t2.c)
FROM t1
LEFT JOIN t2
 ON(t1.a = t2.a)
GROUP BY t1.a,t1.b

MIN()选择每个组的所有结果集中的最小值,因此如果返回10MIN()将显示{{1}因为它较小。

答案 1 :(得分:2)

SELECT t1.A, B, C
FROM   t1
       LEFT OUTER JOIN
       ( SELECT A, C
         FROM   (
           SELECT A, C,
                  ROW_NUMBER() OVER ( PARTITION BY A ORDER BY C ) AS rn 
           FROM   t2
         )
         WHERE rn = 1
       ) t2
       ON ( t1.A = t2.A )

SELECT t1.A, B, C
FROM   t1
       LEFT OUTER JOIN
       ( SELECT A, MIN(C) AS C
         FROM   t2
         GROUP BY A
       ) t2
       ON ( t1.A = t2.A )