2016-10-08 6 views
0

私はプログラミングには初めてですヘルプ各EXE名の最高バージョンのデータを取得する必要があります。私はこれについて同じ記事を見つけましたが、私たちは異なるテーブル構造を持っているので、彼らは私の問題で私を本当に助けませんでした。
私はこのテーブルを持っている:INNER JOIN with MAX関数

テーブルmForm

FormID  FormName   EXEname  CurrentVersion 
-------------------------------------------------------- 
BTC-01  CASH REVIEW  BTC-01.EXE 1.0.2.5 
BTC-02  CASH REQUEST BTC-02.EXE 1.1.2.4 
BTC-03  PAYMENTS  BTC-03.EXE 1.0.0.3 

テーブルmVersionHistory

EXEname   FormName  Version  ReleasedDate ReleaseDescription 
----------------------------------------------------------------------------- 
BTC-01.EXE  CASH REVIEW  1.0.2.5  08-08-16  IT REQ 10063 
BTC-01.EXE  CASH REVIEW  1.0.2.4  08-08-10  IT REQ 10051 
BTC-01.EXE  CASH REVIEW  1.0.2.3  08-08-09  IT REQ 10050 
BTC-02.EXE  CASH REQUEST 1.1.2.4  08-08-13  IT REQ 10003 
BTC-02.EXE  CASH REQUEST 1.1.2.0  08-08-10  IT REQ 10002 
BTC-03.EXE  PAYMENTS  1.0.0.2  08-08-07  IT REQ 10102 
BTC-03.EXE  PAYMENTS  1.0.0.1  08-08-06  IT REQ 10092 

私はトンとの明確なデータを返すようにしたいです彼は最高のバージョン。私は私のコードでそれを行うことができます

EXEname   FormName  CurrentVersion Version  ReleasedDate ReleaseDescription 
---------------------------------------------------------------------------------------------- 
BTC-01.EXE  CASH REVIEW  1.0.2.5   1.0.2.5  08-08-16  IT REQ 10063 
BTC-02.EXE  CASH REQUEST 1.1.2.4   1.1.2.4  08-08-13  IT REQ 10003 
BTC-03.EXE  PAYMENTS  1.0.0.3   1.0.0.2  08-08-07  IT REQ 10102 

が、問題は、私は、私はそれらを追加するたびに説明してRELEASEDATE列を追加カント、彼らは異なるデータを持っているので、すべてのデータが現れるでしょう、次のとおりです。このような DescriptionとReleaseDateの列にあります。私が説明してRELEASEDATE列を追加する必要があり

SELECT 
A.FormID [FORM ID] 
, A.FormName [FORM NAME] 
, A.ExeName [EXE NAME] 
, A.CurrentVersion [CURRENT VERSION] 
, B.RVersion AS [RELEASED VERSION] 
FROM 
mForm A 
INNER JOIN 
(SELECT Exename, MAX(Version) AS RVersion 
FROM mVersionHistory 
GROUP BY ExeName) B 
ON A.ExeName = B.ExeName 
GROUP BY A.FormID, B.FormName, A.CurrentVersion, B.RVersion, A.ExeName 


?あなたがクロスを後でSQLのバージョンに適用されます使用することができます おかげ

+0

テーブルを使用することができますmFormはすでに、右、各アプリケーションの最新バージョンを持っていますか? – qxg

+0

@qxgええ、彼らは最新のバージョンを持っています –

+0

私はなぜあなたが 'MAX'バージョンをもう一度入手しなかったのですか? – qxg

答えて

0

あなたはROW_NUMBERウィンドウ関数

;WITH cte 
    AS (SELECT A.formid     [FORM ID], 
       A.formname     [FORM NAME], 
       A.exename     [EXE NAME], 
       A.currentversion   [CURRENT VERSION], 
       B.rversion     AS [RELEASED VERSION], 
       ---You can add whatever columns need from mversionhistory table 
       Row_number()OVER(partition BY A.exename ORDER BY b.version DESC) AS Rn 
     FROM mform A 
       INNER JOIN mversionhistory B 
         ON A.exename = B.exename) 
SELECT * 
FROM cte 
WHERE rn = 1 
+0

これは実際に私が今行ったことですが、ありがとう –

0

SELECT 
A.FormID [FORM ID] 
, A.FormName [FORM NAME] 
, A.ExeName [EXE NAME] 
, A.CurrentVersion [CURRENT VERSION] 
, c.RVersion AS [RELEASED VERSION] 
FROM 
mForm A 
cross apply 
(SELECT top 1 Exename, Version AS RVersion 
FROM mVersionHistory B 
where A.ExeName = B.ExeName and a.FormName = b.FormName 
order by version desc) c 
+0

もし私が適切な場合、私はこのアプローチのために行く –