1

注: SQL 2000 を使用しています。

この Join に対してこのようなことを行うことで、t2.JobCompletionTime の MAX 日付の行を選択したいと思いますが、これが機能しないため、これが正しいコード/構文ではないことはわかっています...しようとしています。

LEFT OUTER JOIN (
  SELECT *
  FROM DSM_StandardProcedureActivityView
  WHERE
  ( (PackageName = 'Adobe Acrobat 10'  AND PackageVersion = '-1.0') AND
    (MAX (JobCompletionTime))
  )
) t2 ON t1.UUID = t2.UUID

現在の私の完全に機能するSQLコードは次のとおりです。

SELECT 
t1.Business,
t1.[Sub-Business],
t1.Pole,
t1.DomainManager,
t1.ScalabilityServer,
t1.Location,
t1.Country,
t1.Name,
t3.VolumeName,
t3.VolumeFreeInMB,
t3.VolumeSizeInMB,
FROM (
  SELECT *
  FROM DSM_StandardGroupMembersView
  WHERE 
  (  GroupName = 'Adobe Acrobat'
  )
) t1
LEFT OUTER JOIN (
  SELECT *
  FROM DSM_StandardProcedureActivityView
  WHERE
  ( (PackageName = 'Adobe Acrobat 10'  AND PackageVersion = '-1.0')
  )
) t2 ON t1.UUID = t2.UUID
LEFT OUTER JOIN (
  SELECT *
  FROM DSM_StandardHardwareDiskUsageView
  WHERE VolumeName = 'C:\'
) t3 ON t1.Name = t3.Name
ORDER BY t1.Business, t1.[Sub-Business], t1.Pole, t1.DomainManager, t1.ScalabilityServer, t1.Country, t1.Location, [Job Status], t1.Name
4

3 に答える 3

1

関係のない SQL があまりにも多く投稿されているため、私はその抜粋を修正します。

LEFT OUTER JOIN (
  SELECT * FROM (
    SELECT *
    FROM DSM_StandardProcedureActivityView
    WHERE PackageName = 'Adobe Acrobat 10'
    AND PackageVersion = '-1.0'
    ORDER BY JobCompletionTime DESC) x
   ) y
   GROUP BY PackageName, PackageVersion
) t2 ON t1.UUID = t2.UUID

ここで何が起こっているかというと、内部クエリは最初に最新の JobCompletionTime で並べ替えられた行を取得し、次のレベルのクエリは一致する列でグループ化を使用します。これにより、mysql で最初に一致する行が得られます (行を並べ替えたため、最新のものです)。

于 2012-05-01T13:32:43.470 に答える
1

ここでは ROW_NUMBER() というランキング関数が役立ちます

LEFT OUTER JOIN (
    SELECT 
        *, 
        rowNumber = ROW_NUMBER() OVER (ORDER BY JobCompletionTime DESC)
    FROM DSM_StandardProcedureActivityView
    WHERE PackageName = 'Adobe Acrobat 10'
    AND PackageVersion = '-1.0'
) t2 ON t1.UUID = t2.UUID AND rowNumber = 1

JobCompletionTime による順序付け (降順) では、最大値を行番号 1 として配置する必要があります。したがって、追加の句が結合句に追加されます。

于 2012-05-01T13:38:07.950 に答える
1

ここで解釈エラーが発生する可能性がある場所をより明確にするために、これを段階的に実行します...

ステップ1:クエリを少し美しくする+ORDER BY後で簡単に追加できるように除外する

SELECT t1.Business,
       t1.[Sub-Business],
       t1.Pole,
       t1.DomainManager,
       t1.ScalabilityServer,
       t1.Location,
       t1.Country,
       t1.Name,
       t3.VolumeName,
       t3.VolumeFreeInMB,
       t3.VolumeSizeInMB

  FROM DSM_StandardGroupMembersView  t1

  LEFT OUTER JOIN DSM_StandardProcedureActivityView t2
               ON t2.PackageName = 'Adobe Acrobat 10'  
              AND t2.PackageVersion = '-1.0'
              AND t2.UUID = t1.UUID

  LEFT OUTER JOIN DSM_StandardHardwareDiskUsageView t3
               ON t3.VolumeName = 'C:'
              AND t3.Name = t1.Name

 WHERE t1.GroupName = 'Adobe Acrobat'

私があなたの質問を理解する方法は、DSM_StandardProcedureActivityView t2 からのレコードを、(t2.JobCompletionTime フィールドに基づいて) 最新の状況を表すものだけに制限したいということです。右 ?ここで、これを前もってグループ化してから (UUID で) 一致するものと結合するか、これを逆に考えて、最初にリストを必要な UUID に限定してから、より最近のものをすべて取り除きます。バージョン。SQL2000 を使用しているため、クエリ オプティマイザーが前者を最適化できるかどうかわからないため、後者をお勧めします。(お気軽にテストしてください =)

これは次のようになります。

SELECT t1.Business,
       t1.[Sub-Business],
       t1.Pole,
       t1.DomainManager,
       t1.ScalabilityServer,
       t1.Location,
       t1.Country,
       t1.Name,
       t3.VolumeName,
       t3.VolumeFreeInMB,
       t3.VolumeSizeInMB

  FROM DSM_StandardGroupMembersView  t1

  LEFT OUTER JOIN DSM_StandardProcedureActivityView t2
               ON t2.PackageName = 'Adobe Acrobat 10'  
              AND t2.PackageVersion = '-1.0'
              AND t2.UUID = t1.UUID
              -- limit to latest records only!
              AND NOT EXISTS ( SELECT *
                                 FROM DSM_StandardProcedureActivityView t2_newer
                                WHERE t2_newer.UUID = t2.UUID
                                  AND t2_newer.JobCompletionTime > t2.JobCompletionTime )

  LEFT OUTER JOIN DSM_StandardHardwareDiskUsageView t3
               ON t3.VolumeName = 'C:'
              AND t3.Name = t1.Name

 WHERE t1.GroupName = 'Adobe Acrobat'

お役に立てれば。

于 2012-05-03T08:06:14.497 に答える