Sql Inner Word lid van de eerste record alleen als Bestaat Neem de volgende

Dit is steun voor mij. Ik kan innerlijke join alleen doen met het eerste resultaat, maar als het bestaat, wil ik het 2e resultaat behalen.

DIT IS MIJN TAFEL A

ID NAME VALUE
1   A     123
2   B     456
3   C     789
4   A     456

TABEL B

BID BNAME BVALUE
1    A     ABC
2    A     CDE
3    B     845
4    C     1234

MIJN SELECT SQL:

SELECT * FROM A
CROSS APPLY (
    SELECT TOP 1 * 
        FROM B

    WHERE A.Name = B.BName 

) BB

Het komt terug

1   A     123  1   A   ABC
2   B     456  3   B   845
3   C     789  4   C   1234
4   A     456  1   A   ABC

Help alstublieft, ik wil dit resultaat:

1   A     123  1   A   ABC
2   B     456  3   B   845
3   C     789  4   C   1234
4   A     456  2   A   CDE

Ik accepteer tmp-tabel en elke soort zoekopdracht :(

3
Zowel tabel A als tabel B hebben A X 2, B X 1, C X 1 . Hoe zouden de gewenste resultaten eruit zien als ze niet hetzelfde nummer hadden voor een van de namen?
toegevoegd de auteur Martin Smith, de bron
U wilt dus (1, 1) en (4, 2) ontvangen, en niet: (1, 2) en (4, 1) ?
toegevoegd de auteur The Nail, de bron
Denk er maar aan dat het altijd hetzelfde aantal rijen is.
toegevoegd de auteur user1074438, de bron

1 antwoord

Na verduidelijking in de opmerkingen dat beide tabellen altijd overeenkomende rijen bevatten.

WITH A
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ID) AS RN
         FROM   TableA),
     B
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY BNAME ORDER BY BID) AS RN
         FROM   TableB)
SELECT A.ID,
       A.NAME,
       A.VALUE,
       B.BID,
       B.BNAME,
       B.BVALUE
FROM   A
       JOIN B
         ON A.NAME = B.BNAME
            AND A.RN = B.RN  
3
toegevoegd