2017-09-04 1 views
0

Je tente de joindre 2 tables, mais seulement sélectionner les valeurs de la table B où id est le plus grand et 2 colonnes correspondent entre le tableau A & B.Rejoindre 2 tables où valeur la plus élevée de sélection sur une autre table

J'ai essayé mais il sélectionne seulement 1 ligne en raison de la valeur la plus élevée de la table 2 mais j'ai besoin de la table entière A pour être affichée.

WITH CTE AS 
(
    SELECT DocNum, Status 
    FROM TableB 
    WHERE Id = (SELECT MAX(Id) FROM TableB) 
) 
SELECT TableA.DocNum, DocTitle, cte.Status 
FROM TableA 
INNER JOIN cte 
ON TableA.DocNum = cte.DocNum 

exemple ci-dessous:

Table A 
    Id DocNum DocTitle 
    1 ST-0001 SomeTitle 
    2 ST-0002 SomeTitle 
    3 ST-0003 SomeTitle 
    4 ST-0004 SomeTitle 
    5 ST-0005 SomeTitle 

Table B 
    Id DocNum Status 
    1 ST-0001 Incomplete 
    2 ST-0001 Complete 
    3 ST-0002 Complete 
    4 ST-0003 Incomplete 
    5 ST-0004 Incomplete 
    6 ST-0004 Complete 
    7 ST-0005 Incomplete 

Result 
    DocNum DocTitle Status 
    ST-0001 SomeTitle Complete 
    ST-0002 SomeTitle Complete 
    ST-0003 SomeTitle Incomplete 
    ST-0004 SomeTitle Complete 
    ST-0005 SomeTitle Incomplete 
+0

Avez-vous essayé quoi que ce soit à ce jour pour résoudre le problème? –

+0

Quelle version de SQL utilisez-vous (par exemple MySQL, SQL Server, etc.)? Avez-vous déjà essayé quelque chose? –

+0

'Join',' Grouper' est la solution –

Répondre

0

Vous pouvez utiliser un CTE avec ROW_NUMBER pour obtenir uniquement les lignes avec l'id max par docnum de tableB, puis rejoindre à cette cte.

d'abord, créer et remplir des exemples de tableaux (S'il vous plaît nous sauver cette étape dans vos questions à venir):

DECLARE @A As Table 
(
    Id int, 
    DocNum char(7), 
    DocTitle varchar(20) 
); 

DECLARE @B As Table 
(
    Id int, 
    DocNum char(7), 
    [Status] varchar(20) 
); 

INSERT INTO @A VALUES 
(1, 'ST-0001', 'SomeTitle'), 
(2, 'ST-0002', 'SomeTitle'), 
(3, 'ST-0003', 'SomeTitle'), 
(4, 'ST-0004', 'SomeTitle'), 
(5, 'ST-0005', 'SomeTitle'); 

INSERT INTO @B VALUES 
(1, 'ST-0001', 'Incomplete'), 
(2, 'ST-0001', 'Complete'), 
(3, 'ST-0002', 'Complete'), 
(4, 'ST-0003', 'Incomplete'), 
(5, 'ST-0004', 'Incomplete'), 
(6, 'ST-0004', 'Complete'), 
(7, 'ST-0005', 'Incomplete'); 

Ensuite, créez la cte avec le row_number de tableB:

;WITH CTE AS 
(
    SELECT Id, 
      DocNum, 
      [Status], 
      ROW_NUMBER() OVER(PARTITION BY DocNum ORDER BY Id DESC) As Rn 
    FROM @B 
) 

La requête:

SELECT A.DocNum, A.DocTitle, CTE.[Status] 
FROM @A A 
INNER JOIN CTE ON A.DocNum = CTE.DocNum 
WHERE CTE.rn = 1 

Résultat:

DocNum  DocTitle Status 
ST-0001  SomeTitle Complete 
ST-0002  SomeTitle Complete 
ST-0003  SomeTitle Incomplete 
ST-0004  SomeTitle Complete 
ST-0005  SomeTitle Incomplete 

You can see a live demo on rextester.

+0

Merci pour cela. Si la TableB ne contient pas le DocNum de la TableA, est-il toujours possible que l'état apparaisse dans la Table résultante comme Null ou simplement vide? J'ai besoin de garder tous les DocNums de la TableA d'origine dans le résultat avec l'état trouvé à côté. – Ryan

+0

Oui, remplacez simplement la jointure interne par une jointure à gauche. –

+0

J'ai essayé mais je n'ai pas eu de succès. Pour exécuter avec votre exemple, j'ai supprimé id (7) de la TableB et cette table résultante n'incluait pas id (5) de TableA quand je le voudrais encore. – Ryan