Question

Cela se rapporte à une autre question que je posais précédemment. Vous pouvez avoir une meilleure compréhension de ce si vous analysez rapidement. flottent numéros de version, décimal ou le double

J'ai deux et un étranger colums dans une table de base de données. [Version] et la colonne [Révision] colonne. Ceux-ci sont en relation avec les numéros de version. par exemple. Version 1, Révision 2 = v1.2

Ce que je dois faire est de saisir le numéro de version maximale pour une clé étrangère particulière.

Voici ce que j'ai à ce jour:

SELECT f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] AND
 f.[Revision] = x.[Revision]

En fait saisir le maximum et rejoindre à lui-même. Cela ne obvisouly pas de travail parce que si je les numéros de version 1.1, 1.2 et 2.0 la valeur maximale Je retourne de la requête ci-dessus est 2.2 (qui n'existe pas).

Ce que je dois faire (je pense) est de sélectionner le maximum [version], puis sélectionnez le maximum [Révision] pour que [version], mais je ne peux pas tout à fait figure comment faire.

Toute aide, suggestions, questions sont les bienvenus.

Merci.

Était-ce utile?

La solution

Vous pouvez changer à

SELECT  f.[pkFileID]
        ,x.[fkDocumentHeaderID]
        ,f.[fkDocumentID]
        ,x.[Version]
        ,x.[Revision]
        ,f.[FileURL]
        ,f.[UploadedBy]
        ,f.[UploadedDate]
FROM    (
          SELECT  docs.[fkDocumentHeaderID]
                  ,MAX([Version] * 100000 + [Revision]) AS [VersionRevision] 
          FROM    [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
                  INNER JOIN dbo.tbl_Documents docs 
                    ON [fkDocumentID] = [pkDocumentID]
          GROUP BY
                  docs.[fkDocumentHeaderID]
        )AS x
        INNER JOIN dbo.tbl_DocumentFiles f 
          ON f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] 
             AND f.[Version] * 100000 + f.[Revision] = x.[VersionRevision] 

L'idée est de multiplier la version avec une assez grande constante de sorte qu'il n'entre en collision avec la révision (j'ai pris 100.000 mais toute valeur serait faire).

Après cela, votre JOIN, même pour récupérer l'enregistrement.

Autres conseils

Le ci-dessous devrait fonctionner pour extraire la révision du dessus.

SELECT TOP 1 f.[pkFileID]
   ,x.[fkDocumentHeaderID]
   ,f.[fkDocumentID]
   ,x.[Version]
   ,x.[Revision]
   ,f.[FileURL]
   ,f.[UploadedBy]
   ,f.[UploadedDate]
FROM 
(
     SELECT 
     docs.[fkDocumentHeaderID]
     ,MAX([Version]) AS Version
     -- Comment this out ,MAX([Revision]) AS Revision
 FROM 
     [ClinicalGuidanceV2].[dbo].[tbl_DocumentFiles]
 INNER JOIN 
     dbo.tbl_Documents docs ON [fkDocumentID] = [pkDocumentID]
 GROUP BY
     docs.[fkDocumentHeaderID]
)
AS x
INNER JOIN
 dbo.tbl_DocumentFiles f ON 
 f.[fkDocumentHeaderID] = x.[fkDocumentHeaderID] AND 
 f.[Version] = x.[Version] 
ORDER BY x.Revision DESC

A savoir, il extrait uniquement les enregistrements en utilisant la version max dans la table x. Ensuite, il ordonne à ces dossiers par la révision dans l'ordre décroissant, et extrait le plus élevé du groupe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top