2016-11-17 12 views
1

SQLの内部結合を使用して4つのテーブルをクエリしています。テーブルHtmlTextの1つにModuleIDVersionの両方の列が含まれています。私が達成したいのは、特定のサイトまたは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]) 

を試してみましたが、何であるしかし、これは(代わりに異なるModuleID

enter image description here

+0

'ANDバージョン= ... 'をあなたの' ON'条件に移してください。これは 'LEFT JOIN'を' WHERE'節に含めることで 'INNER JOIN'に変換しています。 – Siyual

+0

@Siyual私はあなたの提案を試みました。同じ結果が得られました。 – Skullomania

+1

最後の述語を次のように変更してみてください:(MyDB]。[dbo]。[HtmlText] ModuleId = HTM.ModuleId)からMAX([Version]これは、特定のモジュールの最大バージョンを取得します – SteveR

答えて

1

できます

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

これは、最大を取得しますその特定のモジュールのバージョン

2

ROW_NUMBERを使用するすべてのMAXバージョンの、私の最大のVersionModuleIDを与えます)ウィンドウ関数(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

HtmlTextからContent列(または別の1つの列)のみが必要な場合は、このクエリを使用できます。また、モジュールまたはモジュールがオンになっているタブが削除されていないことを確認します。

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値をチェックし、それはおそらくユニークな値(そうが)ではありません

関連する問題