左连接没有重复记录只显示1个最小值

时间:2013-11-11 21:00:23

标签: sql join duplicates

我有一个table_1:

id  custno
1   1
2   2
3   3

和table_2:

id  custno  qty
1   1       10 
2   1       7
3   2       4
4   3       7
5   1       5
6   1       5

当我运行此查询以显示每个客户的最小订单数量时:

SELECT table_1.custno,table_2.qty 
FROM table_1 LEFT OUTER JOIN table_2 ON  table_1.custno = table_2.custno AND  
qty = (SELECT MIN(qty) FROM table_2  WHERE table_2.custno = table_1.custno   )

然后我得到了这个结果:

custno qty
1      5
1      5
2      4
3      7

如何获得每qtycustno的最小值?

我怎么能这样做?

THX!

2 个答案:

答案 0 :(得分:5)

您的意思是聚合(GROUP BY):

SELECT table_1.custno,MIN(table_2.qty) AS [min_val]
FROM table_1 
LEFT OUTER JOIN table_2 ON  table_1.custno = table_2.custno 
GROUP BY table_1.custno

答案 1 :(得分:2)

SELECT table_2.custno, MIN(qty) as qty, descr
FROM table_2   
    LEFT OUTER JOIN table_1  
    on table_2.custno = table_1.custno 
GROUP BY table_2.custno, table_2.descr
ORDER BY table_2.custno

注意:上面table_1的链接仅包含在假设中,您要么(1)使用表2中的JOIN 选择行 - 换句话说,table_2在table_1中有一些不存在的常规 - 或者(2)对于descr列的不同值,qty列有不同的值(仅在列中提到的列)你的评论,关于后来被删除的另一个答案)。

但如果两个表具有相同的custnos,并且一个descr的min(qty)与另一个的min(qty)相同,那么JOIN是不必要的:

SELECT custno, MIN(qty) as qty, descr
FROM table_2   
GROUP BY custno, descr
ORDER BY custno


但是,如果不同的descr列值有不同的MIN(qty)值,并且您希望看到 all descr值,但只有一个MIN(qty),(MIN(qty)为所有)...那么你必须要有创意...就像加入两次所以列可以独立变化 这是Yosi的答案的变体,可以处理:

SELECT table_1.custno, MIN(T2A.qty) AS [min_val], T2B.descr
FROM table_1 
LEFT OUTER JOIN table_2  T2A  ON  table_1.custno = T2A.custno 
LEFT OUTER JOIN table_2  T2B  ON  table_1.custno = T2B.custno 
GROUP BY table_1.custno, T2B.descr
ORDER BY table_1.custno