[T-SQL] SELECT op tabel met PK van meerdere kolommen

Pagina: 1
Acties:
  • 174 views sinds 30-01-2008
  • Reageer

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Ik heb nu in SQL Server een tabel die een Primary Key heeft die is opgebouwd uit meerdere kolommen: ID en Versie.
Samen vormen die dus een unieke waarde, maar het ID kan dus wel in meerdere rijen voorkomen, maar dan met een ander versie-nummer.
Nu wil ik een select uitvoeren die ALLEEN de rijen selecteert met het hoogste versienummer.
Dus stel, ik heb deze gegevens:
code:
1
2
3
4
5
6
7
ID  Versie  Naam
1   1   Naam1.1
1   2   Naam1.2
1   3   Naam1.3
2   1   Naam2.1
2   2   Naam2.2
3   1   Naam3.1

Dan wil ik dus een select die ALLEEN 'Naam1.3, Naam2.2, Naam3.1' teruggeeft.
Ik heb nu wel een statement die de goede rijen selecteert, maar die selecteert alleen het ID en Versie nummer:
SELECT ID, MAX(Versie) FROM Namen GROUP BY ID

Ik neem aan dat ik dat statement moet gebruiken als subquery, maar hoe kan ik dan opgeven dat ie alleen de rijen moet selecteren die aan zowel het ID als aan het versienummer voldoen ?
Als ik iets opgeef als 'WHERE ID IN <statement> AND Versie IN <statement>', dan krijg ook bijv. Naam1.2 terug omdat ID=1 voorkomt EN Versie=2 komt voor.
Hoe kan ik dit oplossen ?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Probeer deze query maar eens:

SELECT N.ID, N.Versie, N.Naam
FROM Namen N
JOIN (
SELECT ID, MAX(Versie) AS MaxVersie
FROM Namen
GROUP BY ID) AS SUB ON (SUB.ID = N.ID AND SUB.MaxVersie = N.Versie)

Never underestimate the power of


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

zo te zien zijn er meerdere wegen die naar Rome leiden (als je naar het exec plan kijkt doen ze overigens intern hetzelfde)
code:
1
2
3
4
SELECT A.ID, A.Versie, A.Naam
FROM   Namen A
WHERE  Versie =
       ( SELECT MAX(B.Versie) FROM Namen B WHERE B.ID = A.ID )

Today's subliminal thought is:


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Annie schreef op 02 september 2002 @ 14:51:
zo te zien zijn er meerdere wegen die naar Rome leiden (als je naar het exec plan kijkt doen ze overigens intern hetzelfde)
Dat is dan te danken aan de optimizer.
In veel gevallen zijn subqueries die als filter een veld uit de bovenliggende query hebben aanzienlijk minder efficiënt.

Never underestimate the power of


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Ik had het zelf al opgelost door van het statement dat ik al had een view te maken en daarop te joinen.
Dat werkte op zich goed, tot het moment waarop ik de tabel weer wilde gaan opslaan vanuit m'n DataSet (C#) door middel van een CommandBuilder.
Die kan blijkbaar geen update-statements genereren als er een join in het select-statement zit.
Ik heb nu de oplossing van Annie geprobeerd en die werkt perfect !!
Thnx !