2016-11-17 9 views
1

Я использую SQL-левое внутреннее соединение для запроса 4 таблиц. Одна из таблиц HtmlText содержит как ModuleID, так и Version столбцы. Я хочу выполнить только MAX-версию каждого ModuleID с определенного сайта или PortalID. Вот то, что я попыталсяКак получить последние версии модулей в моем левом внутреннем соединении?

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, вместо MAX версии всех разная ModuleID s

enter image description here

+0

Переместите свою 'AND Version = ...' в состояние 'ON'. Он превращает «LEFT JOIN» в «INNER JOIN», включив его в предложение «WHERE». – Siyual

+0

@Siyual Я попробовал ваше предложение и получил тот же результат – Skullomania

+1

попробуйте изменить свой последний предикат на следующее: (Выберите MAX ([Version]) из [MyDB]. [Dbo]. [HtmlText], где ModuleId = HTM.ModuleId). Это получит максимальную версию для этого конкретного модуля. – SteveR

ответ

1

Попробуйте изменить свой последний предикат к этому:

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

Это позволит получить максимальную версия для этого конкретного модуля

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

Вы можете использовать этот запрос, если вам нужен только столбец 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, но это, возможно, не единственное значение (хотя и маловероятно)