Sql server 如何在左侧内部联接中获取最新版本的模块?

Sql server 如何在左侧内部联接中获取最新版本的模块?,sql-server,left-join,inner-join,ssms,dotnetnuke,Sql Server,Left Join,Inner Join,Ssms,Dotnetnuke,我使用SQL左内部联接查询4个表。其中一个表HtmlText同时包含ModuleID和Version列。我想要完成的是只从特定站点或PortalID中提取每个ModuleID的最大版本。这是我试过的 SELECT TBS.PortalID [PortalID], TBS.TabID [TabID], TBS.TabName [TabName], TBS.TabPath [TabPath], HTM.Version[Version], TBM.ModuleID [ModuleID],

我使用SQL左内部联接查询4个表。其中一个表HtmlText同时包含ModuleID和Version列。我想要完成的是只从特定站点或PortalID中提取每个ModuleID的最大版本。这是我试过的

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,而不是所有不同ModuleID的最大版本


在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,以便获得第一个实例,即最大版本。

在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,以便获得第一个实例,即最大版本。

如果您只需要内容列或来自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
您只需检查ModuleFID是116还是其他数字。这可能因DNN安装而异


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

如果您只需要内容列或来自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
您只需检查ModuleFID是116还是其他数字。这可能因DNN安装而异


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

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

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

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

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

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

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

移动您的和版本=。。。以你的条件。通过将左连接包含在WHERE子句中,它正在将左连接转换为内部连接。@Siyual我尝试了您的建议,并将上一个谓词更改为:从[MyDB].[dbo].[HtmlText]WHERE ModuleId=HTM.ModuleId中选择MAX[Version]。这将获得该特定应用程序的最大版本module@SteveR我用你的建议作为解决方案,请把它变成一个答案,这样我就可以给你的信用移动和版本=。。。以你的条件。通过将左连接包含在WHERE子句中,它正在将左连接转换为内部连接。@Siyual我尝试了您的建议,并将上一个谓词更改为:从[MyDB].[dbo].[HtmlText]WHERE ModuleId=HTM.ModuleId中选择MAX[Version]。这将获得该特定应用程序的最大版本module@SteveR我使用了你的建议作为解决方案,请将此作为一个答案,这样我可以给你信用