如何在左内连接中获取最新版本的模块?
How do I get latest versions of modules in my left inner join?
我正在使用 SQL 左内连接来查询 4 个表。其中一个表 HtmlText
包含 ModuleID
和 Version
列。我想要完成的是仅从特定站点或 PortalID
中提取每个 ModuleID
的 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])
但这只给我最大 Version
的 ModuleID
,而不是所有不同 ModuleID
s
的 MAX 版本
在派生的 table(FROM 子句中的子查询)中使用 ROW_NUMBER() 窗口函数:
(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
中的 Content
列(或另一个列),则可以使用此查询。它还确保模块所在的模块或选项卡未被删除。
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
您只需要检查 ModuleDefID
是 116
还是其他数字。这可能因 DNN 安装而异。
这可以在 ModuleDefinitions
table 中找到,默认 FriendlyName
为 Text/HTML
。您可以将 ModuleDefinitions
包含在查询中并检查 FriendlyName
值,但这可能不是唯一值(尽管不太可能)
尝试将您的最后一个谓词更改为:
AND Version = (Select MAX([Version]) from [MyDB].[dbo].[HtmlText] where ModuleId = HTM.ModuleId)
这将获得该特定模块的最高版本
我正在使用 SQL 左内连接来查询 4 个表。其中一个表 HtmlText
包含 ModuleID
和 Version
列。我想要完成的是仅从特定站点或 PortalID
中提取每个 ModuleID
的 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])
但这只给我最大 Version
的 ModuleID
,而不是所有不同 ModuleID
s
在派生的 table(FROM 子句中的子查询)中使用 ROW_NUMBER() 窗口函数:
(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
中的 Content
列(或另一个列),则可以使用此查询。它还确保模块所在的模块或选项卡未被删除。
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
您只需要检查 ModuleDefID
是 116
还是其他数字。这可能因 DNN 安装而异。
这可以在 ModuleDefinitions
table 中找到,默认 FriendlyName
为 Text/HTML
。您可以将 ModuleDefinitions
包含在查询中并检查 FriendlyName
值,但这可能不是唯一值(尽管不太可能)
尝试将您的最后一个谓词更改为:
AND Version = (Select MAX([Version]) from [MyDB].[dbo].[HtmlText] where ModuleId = HTM.ModuleId)
这将获得该特定模块的最高版本