« Luchiano, de knie, de beertjes en de Spoedeisende Hulp | Main | Diana smeert een stokbrood »

Heggenschaar, kappersschaar

Sommige dingen zijn gemakkelijk met sommige apparaten maar andere dingen weer een stuk moeilijker. Zo kan men met een heggenschaar eenvoudig een heg netjes maken maar is deze minder geschikt om een kapsel mee te fatsoeneren.

Een inleiding tot een voor slechts een klein gezelschap interessant gegeven. Ergens in 1988 of 1989 was ik net Database Administrator bij de Detam. Wij werkten met het Codasyl Netwerk DBMS IDS-2 op een Honeywell-Bull DPS8 mainframe met GCOS8 als Operating System. In die tijd blaakte Bull van het zelfvertrouwen en grapte men dat GCOS stond voor God's Chosen Operating System. Nu piepen ze wel anders.

Relationele database management systemen (RDBMS) waren in opmars en samen met Data Administrator Jan Dijkstra bezocht ik een seminar van professor dr. J.F. Vandenbulcke. Hij vertelde ons over de taal SQL (Structured Query Language) en hoe gemakkelijk men, vergeleken met talen als Cobol of C, er gegevens uit databases mee kon opvragen.

Stel men heeft een tabel met de naam SPELERS. Het enige (relevante) attribuut is het veld BONDSNUMMER. Een rapport met alle gegevens, gesorteerd op bondsnummer krijgt men met de volgende query: SELECT BONDSNUMMER FROM SPELERS ORDER BY BONDSNUMMER DESC.

Heel eenvoudig. Maar hoe krijgt men als resultaat alleen de drie hoogste bondsnummers? Vreemd genoeg is dat in standaard SQL plotseling veel complexer:

SELECT BONDSNUMMER
FROM SPELERS A
WHERE 3 > (SELECT COUNT(*) FROM SPELERS B WHERE A.BONDSNUMMER < B.BONDSNUMMER)
ORDER BY BONDSNUMMER DESC;

Soms is rond beter, soms vierkant. Zijn er hier nog programmeurs in de zaal?

Comments

Ik weet niets van pure SQL, alleen van MySQL, maar daarmee kan ik de uitvoer van de query gewoon limiteren tot de eerste 3 resultaten.

In MS Access kan het met:
SELECT TOP 3 BONDSNUMMER
FROM SPELERS
ORDER BY BONDSNUMMER DESC;

Ik zeg: excel! :-)

Werkte men toen niet ook samen met Burroughs?

te lang geleden turbo pascal gehad, weet niet meer hoe dat in Turbo pascal geschreven zou moeten worden, in excel zou het nog wel lukken denk ik (ga nu niet mijn hersenen pijnigen het is vrijdag avond en heb net happy hour met kippepoten en polar achter de rug.
over projecten gesproken, Santabarbaraplantation.com moet je eens bekijken, het is echt zo groen op curacao dit moment, en als je me niet gelooft stuur ik je wel wat foto's, leuk stukje achtertuin om een balletje te slaan.

Gelukkig heb ik meer verstand van Belgische biersoorten en Spaanse Brandy.

niet echt!

Huh?!

@IJsbrand: Ansi SQL is de standaard voor deze taal. Oracle, MySQL, SQL Server etc. zijn allemaal dialecten met (nuttige) toevoegingen. Het mooie van dit voorbeeld is dat je zonder een truc de juiste deelverzameling overhoudt.
@Laurent: Precies, de TOP-functie is zo'n toevoeging. Toch is dat minder mooi, maar ja nostalgie. Er zijn ook mensen die vinden dat het echte autorijden handgeschakeld en zonder ESP is.
@Pascale: Ik zeg: okay, laat de belastingdienst al hun gegevens maar eens in een Excel-sheet proppen. Dan gaat het ZEKER mis, haha.
@Terrebel: Neen, Burroughs was juist een concurrent van Bull. Burroughs heeft Sperry overgenomen en werd toen Unisys. Tegenwoordig verleent dit bedrijf informatietechnologie services.
( http://nl.wikipedia.org/wiki/Unisys )
@Ennu: Turbo Pascal, later gevolgd door Tubro C, was lange tijd mijn favoriete programmeertaal. Het is een 3GL en record-georienteerd terwijl SQL een tabel- ofwel bestands-georienteerde taal is. Dit is echter totaal niet van belang als men net bij 30 graden Polar en kippenbouten naar binnen gewerkt heeft. Santabarbaraplantation.com klinkt interessant. Onze achtertuin is op dit moment wit.
@El Alcalde: Dat is ook veel belangrijker. Ik weet er nog niet genoeg van, ga me vanavond weer wat verder verdiepen in de wereld die Westmalle heet.
@Henk: Taxichauufeurs dan?
@Trezeguet: Lees het nog maar een keer rustig door... ;-)

Als je iets snapt is het eenvoudig ja, meestal!

$link = mysql_connect ($host, $user, $pw) or die;
mysql_select_db("blogbase",$link) or die;
$qset = mysql_query("SELECT name, popularity FROM bloggers WHERE blogger_id = 'CS'");
$row = mysql_fetch_assoc($qset);
print $row["name"].' - '.$row["popularity"];

Resultaat: "CasaSpider - Very"

Sheesh.

@Renesmurf: Het is nu eenmaal gemakkelijker een koe van achteren in de kont te kijken.
@RvanInR: Perl! Knap stukje programmeerwerk, maar heb je het resultaat ook getest? Testen, daar ontbreekt het vaak aan.
@Irene: Ja, zeg dat wel. Wat is de populariteit van 'SD' trouwens? Ik gok: 'Ultimate'.

Dit resultaat testen wij dagelijks en al gedurende vele jaren ;-)

Als .netter met Linq...
var first3Spelers =
(
from s in Spelers
select s //Voor het gehele spelers object
select new { s.Voornaam, s.Naam } //Voor alleen 2 velden in een nieuw object.
).Take(3);

Natuurlijk hebben we in Linq ook nog de .Skip of de .SkipWhile of .TakeWhile

Gebruik van deze code is op eigen risico, niet getest;)

Vind de foutafhandeling in .net toch iets vriendelijker, "Catch" ipv "die" zoals perl en php volgens mij ook...

@RvanInR: Dank u wel, helaas is het met bloggen net zoals met films maken: je bent zo goed als je laatste film...
@Carolus: Ik heb nooit met Linq gewerkt. Een vraagje: Hoe is bepaald dat hiermee de hoogste drie bondsnummers worden geselecteerd? Ik zie nergens een sortering, laat staan een in aflopende volgorde.

Het scherpe oog van een dba... "orderby s.Bondsnummer desc" direct na de select ontbreekt nog.

@Carolus: Mijn gewone ogen hebben -6 maar het DBA-oog is goed getraind... ;-)

Bondsnummer moet wel uniek zijn, anders krijg je niet de drie hoogsten :-) Veiliger zou zijn om een GROUP BY te gebruiken en sneller om een cross join te gebruiken.

SELECT * FROM Gebruikers WHERE Clue > 0

(0) rows affected...