如何在左内连接中获取最新版本的模块?

时间:2016-11-17 20:40:52

标签: sql-server left-join inner-join ssms dotnetnuke

我使用SQL左内连接来查询4个表。其中一个表HtmlText包含ModuleIDVersion列。我想要完成的只是从特定网站或ModuleID中提取每个PortalID的MAX版本。这是我试过的

SELECT TBS.PortalID [PortalID], TBS.TabID [TabID], TBS.TabName [TabName], 
TBS.TabPath [TabPath], HTM.Version[Version], TBM.ModuleID [ModuleID],     
MDS.ModuleID[ModuleID], HTM.Content[Content]
FROM [MyDB].[dbo].[Tabs] TBS
Inner JOIN [MyDB].[dbo].[Modules] MDS 
LEFT JOIN [MyDB].[dbo].[TabModules] TBM
LEFT JOIN [MyDB].[dbo].[HtmlText] HTM 
ON HTM.[ModuleID] = TBM.[ModuleID]
ON MDS.[ModuleID] = TBM.[ModuleID]
ON TBS.[TabID] = TBM.[TabID] 
WHERE TBS.[PortalID] = '0' AND DataLength(HTM.[Content]) <> 0  
AND Version = (Select MAX([Version]) from [MyDB].[dbo].[HtmlText]) 

但这只会给ModuleID Version ModuleID,而不是所有不同(defn my-fn [] (throw (IllegalStateException.))) (fact (my-fn) => (throws IllegalStateException)) 的最高版本

enter image description here

3 个答案:

答案 0 :(得分:2)

在派生表中使用ROW_NUMBER()窗口函数(FROM子句中的子查询):

(SELECT iHTM.ModuleID,
       iHTM.Version,
       rownum = ROW_NUMBER()
                    OVER (
                        PARTITION BY iHTM.ModuleID
                        ORDER BY iHTM.Version DESC)
  FROM [MyDB].[dbo].[HtmlText] iHTM) htmVER

并且在ON子句中,请务必包含htmVER.rownum = 1,以便获得第一个实例(即最佳版本)。

答案 1 :(得分:1)

如果您只需要Content中的HtmlText列(或另一个列),则可以使用此查询。它还确保模块或模块所在的选项卡尚未删除。

SELECT Modules.PortalID, TabModules.TabID, Tabs.TabName, Tabs.TabPath, Modules.ModuleID,
(SELECT TOP (1) [Content] FROM HtmlText WHERE (ModuleID = Modules.ModuleID) ORDER BY Version DESC) AS Content
FROM Modules
INNER JOIN TabModules ON TabModules.ModuleID = Modules.ModuleID
INNER JOIN Tabs ON Tabs.TabID = TabModules.TabID
WHERE (Modules.ModuleDefID = 116) AND (Modules.IsDeleted = 0) AND (Tabs.IsDeleted = 0) AND (Modules.PortalID = 0)
ORDER BY Modules.PortalID, TabModules.TabID, Modules.ModuleID

您只需要检查ModuleDefID116还是其他号码。这可能因DNN安装而异。

这可以在ModuleDefinitions表格中找到,默认FriendlyNameText/HTML。您可以在查询中包含ModuleDefinitions并检查FriendlyName值,但这可能不是唯一值(尽管不太可能)

答案 2 :(得分:1)

尝试将上一个谓词更改为:

AND Version = (Select MAX([Version]) from [MyDB].[dbo].[HtmlText] where ModuleId = HTM.ModuleId)

这将获得该特定模块的最大版本