• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 461
  • Last Modified:

Inner join on a Select statement

I have two tables that I am trying to join, but I need to perform a MAX function against the second table before they are joined.

CREATE TABLE [dbo].[GroupPolicyObjects] (
      [gpoID] [varchar] (38) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [DisplayName] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [CreationTime] [datetime] NOT NULL ,
      [ModificationTime] [datetime] NOT NULL ,
      [Owner] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [IsUserEnabled] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [IsComputerEnabled] [varchar] (5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [UserDSVersionNumber] [int] NOT NULL ,
      [UserSysvolVersionNumber] [int] NOT NULL ,
      [ComputerDSVersionNumber] [int] NOT NULL ,
      [ComputerSysvolVersionNumber] [int] NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[GPODescriptions] (
      [pkAuto] [int] IDENTITY (1, 1) NOT NULL ,
      [gpoID] [varchar] (38) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
      [gpoDescription] [varchar] (8000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
      [editDate] [datetime] NOT NULL ,
      [editByUser] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]

"SElect ID,MAX(EditDate) as Date from GPODescriptions Group BY ID" returns the correct set of rows from the second table, but I can't figure out how to join this with results from GroupPolicyObjects.  GPODescriptions will contain history of descriptions, so there will be multiple records for any gpoID, I just want to return the most recent, based on editDate.

This query:
SELECT GroupPolicyObjects.gpoID,
GroupPolicyObjects.DisplayName,
GroupPolicyObjects.CreationTime,
GroupPolicyObjects.ModificationTime,
GroupPolicyObjects.UserDSVersionNumber,
GroupPolicyObjects.UserSysvolVersionNumber,
GroupPolicyObjects.ComputerDSVersionNumber,
GroupPolicyObjects.ComputerSysvolVersionNumber,
GPODescriptions.gpoDescription,
GPODescriptions.EditByUser,
GPODescriptions.EditDate
FROM GroupPolicyObjects
LEFT OUTER JOIN GPODescriptions
ON GroupPolicyObjects.gpoID = GPODescriptions.gpoID
ORDER BY DisplayName ASC

Returns the right set of columns, with proper joining, but I get an entry for each description when I just want the latest.
0
benhanson
Asked:
benhanson
  • 2
  • 2
1 Solution
 
mastooCommented:
SELECT GroupPolicyObjects.gpoID,
GroupPolicyObjects.DisplayName,
GroupPolicyObjects.CreationTime,
GroupPolicyObjects.ModificationTime,
GroupPolicyObjects.UserDSVersionNumber,
GroupPolicyObjects.UserSysvolVersionNumber,
GroupPolicyObjects.ComputerDSVersionNumber,
GroupPolicyObjects.ComputerSysvolVersionNumber,
GPODescriptions.gpoDescription,
GPODescriptions.EditByUser,
GPODescriptions.EditDate
FROM GroupPolicyObjects
LEFT OUTER JOIN ( ( Select ID,MAX(EditDate) as MaxDate
  from GPODescriptions
  Group BY ID ) As MyMax
Join GPODescriptions
  On MyMax.ID = GPODescriptions.ID
    And MyMax.MaxDate = GPODescriptions.EditDate)
ON GroupPolicyObjects.gpoID = GPODescriptions.gpoID
ORDER BY DisplayName ASC

0
 
benhansonAuthor Commented:
Funny that you mis-typed a few of the gpoID references, since those columns were previously just ID.  Otherwise, I think you've got it!  I'm going to test this in the web interface it is destined for, then accept your comment after testing.  Thanks for the quick answer, my brain was preztelized . . .  Final query(just changed ID to gpoID in a few spots:

 SELECT GroupPolicyObjects.gpoID,
GroupPolicyObjects.DisplayName,
GroupPolicyObjects.CreationTime,
GroupPolicyObjects.ModificationTime,
GroupPolicyObjects.UserDSVersionNumber,
GroupPolicyObjects.UserSysvolVersionNumber,
GroupPolicyObjects.ComputerDSVersionNumber,
GroupPolicyObjects.ComputerSysvolVersionNumber,
GPODescriptions.gpoDescription,
GPODescriptions.EditByUser,
GPODescriptions.EditDate
FROM GroupPolicyObjects
LEFT OUTER JOIN ( ( Select gpoID,MAX(EditDate) as MaxDate
  from GPODescriptions
  Group BY gpoID ) As MyMax
Join GPODescriptions
  On MyMax.gpoID = GPODescriptions.gpoID
    And MyMax.MaxDate = GPODescriptions.EditDate)
ON GroupPolicyObjects.gpoID = GPODescriptions.gpoID
ORDER BY DisplayName ASC
0
 
benhansonAuthor Commented:
That did the trick, thank you very much for your help!
0
 
mastooCommented:
Glad to help.  Sorry for the typos.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now