Solved

Inner join on a Select statement

Posted on 2006-11-03
4
420 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.
0
Comment
Question by:benhanson
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
4 Comments
 
LVL 21

Accepted Solution

by:
mastoo earned 500 total points
ID: 17870433
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
 
LVL 12

Author Comment

by:benhanson
ID: 17870512
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
 
LVL 12

Author Comment

by:benhanson
ID: 17870817
That did the trick, thank you very much for your help!
0
 
LVL 21

Expert Comment

by:mastoo
ID: 17870853
Glad to help.  Sorry for the typos.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Delta outage: 650 cancelled flights, more than 1200 delayed flights, thousands of frustrated customers, tens of millions of dollars in damages – plus untold reputational damage to one of the world’s most trusted airlines. All due to a catastroph…
Recently we ran in to an issue while running some SQL jobs where we were trying to process the cubes.  We got an error saying failure stating 'NT SERVICE\SQLSERVERAGENT does not have access to Analysis Services. So this is a way to automate that wit…
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Via a live example, show how to backup a database, simulate a failure backup the tail of the database transaction log and perform the restore.

696 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question