We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

Inner join on a Select statement

benhanson
benhanson asked
on
Medium Priority
467 Views
Last Modified: 2008-02-01
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.
Comment
Watch Question

Commented:
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

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts
CERTIFIED EXPERT

Author

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
CERTIFIED EXPERT

Author

Commented:
That did the trick, thank you very much for your help!

Commented:
Glad to help.  Sorry for the typos.
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.