2009-11-10 40 views
1

在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 
+0

你能解釋一下你的意思是什麼「一審」?你想要哪一個查詢恰好返回首先,還是有一個更具體的標準來確定哪一個應該返回? – 2009-11-10 19:21:18

回答

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 
+0

這完全按照需要,謝謝! – Cyberherbalist 2009-11-10 19:32:26

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) 

像這樣的東西應該工作。

+0

用於添加「having」子句的+1,該子句保持用戶控制/ which /「first row」返回。 – 2009-11-10 19:22:58

+0

這實際上不起作用,因爲b.empno和a.deptname不會在group by子句中出現......並且當我將它們放在那裏時,結果與原始結果完全相同。 – Cyberherbalist 2009-11-10 19:31:43

+0

這真的很有趣,它不起作用。在DB2中,可能按語句分組的方式與我以前的習慣有點不同。 將b.empno添加到組中肯定無效,因爲「有」組的大小將爲1.特別是,group.by聲明中強制使用a.deptname。嗯。 – Anna 2009-11-10 19:37:22

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 
+0

您提出了一個很好的觀點,但問題中的案例更多地沿着通用示例的界限;在底層真實世界的情況下,即使某些列值在最終結果中被排除,也需要所有列。 – Cyberherbalist 2009-11-10 19:50:44