在左连接中抛出某些结果行

时间:2009-11-10 19:02:37

标签: sql db2

在DB2中,使用以下左连接

select a.deptno, a.deptname, b.empno
from #dept a
left join #emp b
on a.deptno = b.workdept

在两张桌子上,给我一个列表:

dpt  name         emp
----------------------
A01  ACCOUNTING   5001
A02  PAYROLL      NULL
A03  OPERATIONS   5003
A03  OPERATIONS   5004
A03  OPERATIONS   5007
A05  MAINTENANCE  NULL

但我只想要任何dpt的第一个实例。有没有办法对左连接进行编码以仅拉出第一个匹配项,因此它看起来像:

dpt  name         emp
----------------------
A01  ACCOUNTING   5001
A02  PAYROLL      NULL
A03  OPERATIONS   5003
A05  MAINTENANCE  NULL

3 个答案:

答案 0 :(得分:3)

select a.deptno, a.deptname, b.empno
from #dept a
left join #emp b
on a.deptno = b.workdept
group by a.deptno
having b.empno = min(b.empno)

这样的事情应该有效。

答案 1 :(得分:2)

您可以尝试类似

的内容
select a.deptno, a.deptname, min(b.empno)
from #dept a
left join #emp b
on a.deptno = b.workdept
group by a.deptno, a.deptname

答案 2 :(得分:1)

这实际上取决于你如何定义“第一”。在您生成的结果集中,empno基本上是随机的。如果empno无关紧要,为什么不把它排除在外呢?所以:

SELECT DISTINCT a.deptno, a.deptname
FROM #dept aleft 
JOIN #emp bon a.deptno = b.workdept;

如果empno确实重要,那么您需要定义empno最重要的质量并对其进行测试。所以:

SELECT a.deptno, a.deptname, b.empno
FROM #dept aleft 
JOIN #emp bon a.deptno = b.workdept
GROUP BY a.deptno
HAVING  b.empno = some_criteria(b.empno);//where some_criteria is the appropriate function