我使用SQL左内连接来查询4个表。其中一个表HtmlText
包含ModuleID
和Version
列。我想要完成的只是从特定网站或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))
的最高版本
答案 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
您只需要检查ModuleDefID
是116
还是其他号码。这可能因DNN安装而异。
这可以在ModuleDefinitions
表格中找到,默认FriendlyName
为Text/HTML
。您可以在查询中包含ModuleDefinitions
并检查FriendlyName
值,但这可能不是唯一值(尽管不太可能)
答案 2 :(得分:1)
尝试将上一个谓词更改为:
AND Version = (Select MAX([Version]) from [MyDB].[dbo].[HtmlText] where ModuleId = HTM.ModuleId)
这将获得该特定模块的最大版本