2009-11-10 6 views
1

Dans DB2, en utilisant ce qui suit à gauche rejoindreRejetant certaines lignes de résultat dans une jointure gauche

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

sur deux tables, me fait une liste comme:

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

mais je veux que le premier instance de tout dpt. Est-il un moyen de coder la jointure gauche pour tirer seule la première occurrence, de sorte qu'il ressemblerait à ceci:

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

Pouvez-vous expliquer un peu plus ce que vous voulez dire par "première instance"? Souhaitez-vous que la requête soit renvoyée en premier ou y a-t-il un critère plus spécifique pour déterminer lequel doit être renvoyé? –

Répondre

2

Vous pouvez essayer quelque chose comme

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

Cela a fonctionné exactement comme nécessaire, merci! – Cyberherbalist

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) 

Quelque chose comme cela devrait fonctionner .

+0

+1 pour l'ajout d'une clause "having", qui permet à l'utilisateur de contrôler/which/"first row" est renvoyé. –

+0

Cela ne fonctionne pas car b.empno et a.deptname n'apparaissent pas dans la clause group by ... et quand je les mets dedans, les résultats sont exactement les mêmes que l'original. – Cyberherbalist

+0

Ceci est vraiment intéressant que cela ne fonctionne pas. La déclaration group by fonctionne probablement un peu différemment dans DB2 que ce à quoi je suis habitué. Ajouter b.empno au groupe ne fonctionnera sûrement pas, puisque les groupes "ayant" seront de taille 1. Plus particulièrement, un nom d'utilisateur est obligatoire dans le groupe par une déclaration. Hmm. – Anna

1

Cela dépend vraiment de la façon dont vous définissez "premier". Dans le jeu de résultats que vous avez généré, le empno est essentiellement aléatoire. Si le empno n'a pas d'importance, pourquoi ne pas le laisser de côté? Alors:

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

Si la empno importe, alors vous devez définir la qualité des empno est le plus important et le test pour elle. Donc:

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

Vous faites un bon point, mais le cas de la question est plus proche d'un échantillon générique; dans la situation réelle sous-jacente, toutes les colonnes sont nécessaires, même si certaines valeurs de colonne sont exclues du résultat final. – Cyberherbalist

Questions connexes