2010-11-19 5 views
1

Considérez que j'ai tableaux suivants:Comment écrire une requête pour obtenir seulement la première ligne correspondante en joignant deux tables?

Tableau 1:

AId 
AMoniker 

Tableau 2:

BId 
BMoniker 

Table1-> Tableau 2 est relation un à plusieurs

je veux un table de temp hors de ces deux tables où si un Amoniker particulier a plusieurs BMonikers alors seulement le premier devrait aller dans la table.

Par exemple, si les tables sont données suivantes:

Tableau 1:

1 ABCD 
2 DEFG 
3 QWER 

Tableau 2:

1 QZ 
1 XC 
1 CV 
2 DE 
2 OP 
3 QW 

la requête doit retourner les éléments suivants:

ABCD QZ 
DEFG DE 
QWER QW 

Ma requête pour obtenir toutes les lignes est:

select b.BMoniker, a.AMoniker 
into #moniker_map 
from Table1 a inner join Table2 b 
on a.Aid=b.Bid 

Comment puis-je modifier cela pour obtenir seulement 1er rang de Tableau2 pour chaque Id.

J'ai essayé requête suivante:

select b.BMoniker, a.AMoniker 
from Table1 a inner join Table2 b 
on a.Aid=b.Bid 
and b.BMoniker in 
(
    select top 1 BMoniker 
    from Table2 
    where Bid=cb.Bid 
    ORDER BY BMoniker 
) 

mais je reçois l'erreur suivante: syntaxe incorrecte près de mot-clé 'top' Sybase code d'erreur = 156, SQLState = "ZZZZZ"

+1

Vous devez définir la ligne "première". Laquelle? Quel ordre? – Stu

Répondre

0

Peut-être est un typo mais il semble que votre sous-requête fasse référence à un alias de table cb qui n'est pas défini. Pouvez-vous essayer ceci:

select b.BMoniker, a.AMoniker 
from Table1 a inner join Table2 b 
on a.Aid=b.Bid 
and b.BMoniker in 
(
    select top 1 BMoniker 
    from Table2 c 
    where c.Bid=a.Bid 
    ORDER BY BMoniker 
) 
2

choisit la rangée avec une valeur minimale de table2 (syntaxe PostgreSQL):

SELECT a.AMoniker, MIN(b.BMoniker) FROM Table1 a, Table2 b 
WHERE a.Aid = b.Bid GROUP BY 1; 
Questions connexes