Puzzelen met SQL. Tijd voor een echte puzzel PUZZELEN MET SQL

Vergelijkbare documenten
Puzzelen met SQL 38. De Muzieklijst, deel 2 PUZZELEN MET SQL

Puzzelen met SQL: Fileleed

Introductie (relationele) databases

SQL Aantekeningen 3. Maarten de Rijke 22 mei 2003

Query SQL Boekje. Fredrik Hamer

F. TRUYEN - Informatiekunde QBE. MS Access

SQL is opgebouwd rond een basisinstructie waaraan één of meerdere componenten worden toegevoegd.

Datakwaliteitsborging met Oracle dynamisch SQL

Puzzelen met SQL. Komkommertijd PUZZELEN MET SQL

Sparse columns in SQL server 2008

DBMS. DataBase Management System. Op dit moment gebruiken bijna alle DBMS'en het relationele model. Deze worden RDBMS'en genoemd.

Miniles gegevensbanken bevragen met SQL

Excel Controller. Handleiding Excel Controller Wizard

Data Warehouse Script Generator Doel

Datamodelleren en databases 2011

Data Manipulatie. Query Talen. / Informatica

SQL & Relationele datamodellen in interactieve media

SQL / Systeemanalyse

TECHNISCHE UNIVERSITEIT EINDHOVEN. Faculteit Wiskunde en Informatica

Rapportage voor Unit4 Multivers. Eindhoven, 22 juni 2017

Puzzelen met SQL DEV. Crash SQL Investigation

Les 2 Eenvoudige queries

Les 11 : Basis SQL (deel2).

DBMS SQL. Relationele databases. Sleutels. DataBase Management System. Inleiding relationele databases. bestaan uit tabellen.

SQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.

1. Inleiding Inleiding SQL Inleiding Database, databaseserver en databasetaal Het relationele model...

Les S-02: Meer geavanceerde SQL-instructies

Databases - Inleiding

Business Intelligence. Toepassing BI Database en Datawarehouse BI proces BI Organisatie Implementatie BI

Dataconversie met Oracle Spatial

Zelftest SQL Workshop

Structured Query Language

Inleiding Databases en Data Base Management Systems Tabellen Wat is SQL?... 5

Gebruikers Handleiding

Databank - Basis 1. Inhoud. Computervaardigheden en Programmatie. Hoofdstuk 4 Databank - Basis. Terminologie. Navigeren door een Venster

Puzzelen met SQL DBA. De muzieklijst, deel 1. De tabellen De tabellen die we gaan gebruiken in deze puzzel zijn weergegeven in afbeelding 1.

Kennis na het volgen van de training. Na het volgen van deze training bent u in staat:

EXIN Databases en SQL Foundation

= > >= < <= BETWEEN IS NULL IS NOT NULL

Versieperikelen. Bijlage C

Databases en SQL Foundation (DBSQLF.NL)

Structured Query Language (SQL)

Oracle 11g R2 voor ontwikkelaars - deel 1

Elfde-Liniestraat Hasselt Schooljaar TINFO POKER GAME Oracle Scripts

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Anatomie van een databank

Client Applicaties (Browser+Desktop) http/https. Apache Webserver. http proxy. WMS WFS Adm SLD Tomcat. Tomcat. GeoServer. PostGIS

Documenten in en uit Apex

Lekker snel XML met SQL (.nl)

Zelftest SQL Workshop

Toon TITEL, JAAR en PLATVORM van GAMES die voor het jaar 2000 uitkwamen op Nintendo 64

Inhoud. Voorwoord Belangrijkste kenmerken van dit boek De opzet van dit boek Over de auteur Woord van dank

NHibernate als ORM oplossing

[TOETS SQL INLEIDING]

Informatica toets vwo 6 Databases

Informatie & Databases

ISO SQL: Structured Query Language

Oracle Analytische Functies

Technische nota AbiFire5 Rapporten maken via ODBC

Editions Based Redefinition: Tijdens de verbouwing gaat de verkoop door. Lucas Jellema, Alex Nuijten - AMIS Services BV

12. Meer dan één tabel gebruiken en sub-queries

We moeten de accommodaties selecteren die 3 sterren hebben, en in land met ID 10 zitten.

11. Het selecteren van gegevens deel II

Zelftest SQL. Document: n0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

DATAMODEL SQL. Middelbare School. Versie 1.0 Datum 30 oktober 2010 Auteur Mark Nuyens, studentnummer: Groep TDI 1

Power BI visualisaties. Een white paper van BICONOMICS

Vragen hoofdstuk 1: Resultaat

Zelftest DB2 for z/os basiscursus

Invantive 2012 Release 1 (build 44)

Medical Intelligence in de praktijk

1. * Database worden vaak gebruikt in Client-Server architectuur.

SQL: query taal met. woorden. ISO SQL: Structured Query Language. de SQL basis query structuur. voorbeeld: doel: intuitieve query taal

Secure Application Roles

1 Download de database 'bieren.mdb' en bewaar het bestand in c:\werkmap van je computer.

OLAP.

Report generator Gegevens zoeken en kolommen selecteren Rapporten opslaan en beheren... 6

hoofdstuk 9 referentiële integriteit waarborgen overige constraints 9.1 Referentiële integriteit relationele databases 9.1

Relationele Databases 2002/2003

Inhoud. Voorwoord 1 Belangrijkste kenmerken van dit boek 1 De opzet van dit boek 1 Over de auteurs 2 Woord van dank 2

Relationele Databases 2002/2003

Koppeling met een database

Object Oriented Programming

Tentamen Informatica 6, 2IJ60,

Leerjaar 1/2 ICT-Academie. Niveau 4. Applicatie ontwikkeling

Hoofdstuk: 1 Principes van databases

Magnutude 2012 Efficient BI. 18 september Joost de Ruyter van Steveninck

Tentamen Informatica 6, 2IJ60,

Technische nota AbiFire Rapporten maken via ODBC

TECHNISCHE UNIVERSITEIT EINDHOVEN Faculteit Wiskunde en Informatica. Proeftentamen ISO (2R290), query-gedeelte, Oktober 2006

6.8 Lijsten: oefeningen

PL/SQL. Declaraties van variabelen. Structuur PL/SQL is een blok-georiënteerde taal: Toekenningen

Magidoku s en verborgen symmetrieën

Macro s. 4.2 Een macro maken

EN D3.JS SQL SERVER 2016 GEAVANCEERDE VISUALISATIES MET

Data Manipulation Language

EXIN Databases en SQL Foundation

1. Databanken. Wat is een databank? Verschillende opslagmethodes

Fun met webparts in ASP.Net

Les 15 : updaten van gegevens in de database (deel2).

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at

Installatie MicroSoft SQL server 2012 Express

Transcriptie:

5 6 5 16 11 PUZZELEN MET SQL 19 20 22 23 7 28 3 34 37 Puzzelen met SQL 39 42 43 7 48 49 Tijd vo een echte puzzel Sinds het bestaan van deze rubriek, hebben we ons nog niet gewaagd aan het oplossen van echte puzzels. Dan bedoelen we het klassieke puzzelwerk zoals kruiswodraadsels en sudoku s. Van die dingen je als vermaak oplost om de tijd eens rustig do te brengen. Het wdt tijd om ons aan een echte puzzel te wagen. We richten ons dit keer op het kaartspelletje Set. Deze twaalf kaarten bevatten verschillende sets, zes in totaal. Een tijdje geleden heeft Steven Feuerstein, PL/SQL goeroe bij uitstek en bekend bij velen, een blog artikeltje geschreven over het kaartspelletje Set. Als je wel eens een meerdaags seminar van hem hebt bijgewoond, dan heeft hij ongetwijfeld over dit spel gesproken. Hij heeft het er vaak over, omdat hij er heel goed in is. Maar hij vindt ook dat je do het spelen ervan een betere programmeur wdt. Het leert je om out of the box te denken. Tijdens een tweedaagse PL/SQL en Apex conferentie waren wij uitgenodigd om bij de familie Feuerstein te blijven logeren. Uiteraard kwam het spelletje Set dan ook op tafel. Tijdens het spelen, en voal do het verlies, kwam het idee naar boven brelen om een stukje SQL te schrijven om een Set eenvoudig te kunnen identificeren. Spelregels Vodat we naar de uitwerking van de SQL toegaan, laten we eerst eens beginnen met het beschrijven van het spel en de regels. Er zitten totaal 81 kaarten in het spel. Elke kaart heeft vier kenmerken, te weten symbool (oval, squiggle of diamond, kleur (red, purple of green, vulling (solid, striped of open en aantal (1,2 of 3. Een Set bestaat uit drie kaarten waarvo geldt dat elk kenmerk, onafhankelijk van de anderen, allemaal hetzelfde is of juist allemaal verschillend. Het spel begint, na het schudden van de kaarten, met het neerleggen van twaalf kaarten. Dan begint het zoeken naar een Set. Zie je een set van drie kaarten die aan de regels voldoet (per kenmerk allemaal gelijk of allen verschillend, onafhankelijk van elkaar dan roep je SET, en dan zijn de kaarten vo jou. Als alle kaarten op zijn dan heeft degene met de meeste kaarten het spel gewonnen. Laten we eens kijken naar een vobeeld. Een vobeeld van een SET in deze kaarten is: Deze drie kaarten vmen samen een set. In dit geval, omdat alle kaarten per kenmerk verschillen. symbool: allemaal verschillend, de eerste kaart is een ovaal - de tweede een squiggle - de derde een ruit kleur: allemaal verschillend, de eerste is rood - de tweede groen - de derde paars vulling: allemaal verschillend, de eerste is leeg de tweede gevuld de derde gestreept aantal: allemaal verschillend, de eerste zijn twee symbolen de tweede drie symbolen de derde slechts één symbool In dit vobeeld zijn per kenmerk alleen maar verschillen. Dit hoeft niet zo te zijn om een set te vmen. Als de kleur gelijk was geweest, bijvobeeld allemaal rood, dan had dit ook een set gevmd. Vodat we de SQL gaan bekijken, laten we nog één ander vobeeld van een set zien: 33

vobeeld van een set zien: Hiervo geldt: symbool: allemaal hetzelfde kleur: allemaal hetzelfde vulling: allemaal hetzelfde aantal: allemaal verschillend Dek nu de rest van het artikel af en probeer zelf de overige vijf sets maar eens te vinden. Set in SQL Vodat we een SQL statement kunnen schrijven om alle sets te vinden die in de bovenstaande twaalf kaarten staan, zullen we eerst de gegevens van de kaarten in de database moeten krijgen. We kunnen ervo kiezen om deze gegevens in een tabel te inserten, maar dat doen we nu eens niet. In plaats daarvan maken we gebruik van Subquery Facting. Subquery Facting houdt in dat een SQL statement niet meer met een SELECT hoeft te beginnen. Het statement begint dan met WITH. Met dit statement kun je een naam geven aan een inline view en hergebruiken om meerdere plaatsen binnen het SQL statement. Deze feature, zeer krachtig zoals we in dit artikel laten zien, bestaat al geruime tijd. In de tweede release van Oracle 9i is deze mogelijkheid geintroduceerd. De twaalf kaarten waar we mee begonnen zijn als uitgangspunt vo het spel definieren we nu in de WITH clause van het statement. with cards as (select 1 cardno, 'oval' symbol, 'red' col, 'open' shading, 2 qty from dual union all select 2,'squiggle', 'purple', 'solid', 1 from dual union all select 3,'diamond', 'red', 'solid', 3 from dual union all select 4,'squiggle', 'green', 'solid',3 from dual union all select 5,'diamond', 'red', 'striped', 1 from dual union all select 6,'oval', 'purple', 'striped', 1 from dual union all select 7,'oval', 'red', 'open',1 from dual union all select 8,'oval', 'purple', 'open',1 from dual union all select 9,'oval', 'green', 'solid',2 from dual union all select 10,'oval', 'purple', 'solid',1 from dual union all select 11,'oval', 'red', 'open',3 from dual union all select 12,'diamond', 'purple', 'striped',1 from dual from cards Nu we de twaalf kaarten hebben gedefinieerd in de WITH clause, kunnen we deze benaderen alsof het een gewone relationele tabel is. Iedere kaart hebben we een nummer toegekend en iedere kaart heeft zijn specifieke kenmerk als kolom gekregen. De kolommen zijn respectievelijk: kaartnummer, symbool, kleur, vulling en aantal. Deze kaartdefinitie hadden we ook als een gewone inline view kunnen definieren zoals: from (select 1 cardno, 'oval' symbol, 'red' col, 'open' shading, 2 qty from dual union all select 2,'squiggle', 'purple', 'solid', 1 from dual union all select 3,'diamond', 'red', 'solid', 3 from dual union all select 4,'squiggle', 'green', 'solid',3 from dual union all select 5,'diamond', 'red', 'striped', 1 from dual union all select 6,'oval', 'purple', 'striped', 1 from dual union all select 7,'oval', 'red', 'open',1 from dual union all select 8,'oval', 'purple', 'open',1 from dual union all select 9,'oval', 'green', 'solid',2 from dual union all select 10,'oval', 'purple', 'solid',1 from dual union all select 11,'oval', 'red', 'open',3 from dual union all select 12,'diamond', 'purple', 'striped',1 from dual cards De twee bovenstaande statements zijn identiek in het resultaat. De reden dat we hier vo Subquery Facting gekozen hebben, zal verderop duidelijk wden. Oplossing Omdat een set uit drie kaarten bestaat en meerdere keren kan vokomen in verschillende sets, maken we een combinatie van drie maal de ospronkelijke twaalf kaarten. De kaartdefinities die we met de Subquery Facting hebben gemaakt joinen we nu drie keer met elkaar. Dit is een krachtige toepassing van Subquery Facting die niet mogelijk is met een reguliere inline view. Een inline view kun je niet drie maal hergebruiken binnen hetzelfde statement zonder de gehele inline view te herhalen. Met Subquery Facting kan dit echter wel: from cards cards1, cards cards2, cards cards3 De kaartdefinitie die we gemaakt hebben in het vige stukje kunnen we eenvoudig meerdere keren in de FROM clause van de hoofdquery opnemen. Nu hebben we een cartetisch product gekregen met alle mogelijke combinaties van de drie keer twaalf kaarten. Het is uiteraard niet mogelijk om een set te maken met drie keer de eerste kaart, dus deze moeten we uitsluiten in het resultaat. 34

where cards1.cardno <> cards2.cardno and cards1.cardno <> cards3.cardno and cards2.cardno <> cards3.cardno and ((cards1_qty = cards2_qty and cards1_qty = cards3_qty (cards1_ qty <> cards2_qty and cards2_qty <> cards3_qty and cards1_qty <> cards3_qty Nu zijn we alweer een stapje dichter bij de oplossing gekomen, maar we zijn er nog niet. Stel dat je een set hebt met de kaarten 1-2-3. In het resultaat zoals we deze nu hebben zit deze set. Er zit echter ook de set 1-3-2, 2-3-1, 2-1-3, 3-1-2 en 3-2-1. Deze combinatie van drie kaarten stelt echter iedere keer dezelfde set vo. Zo krijgen we niet zes mogelijke combinaties van sets, maar een veelvoud hiervan. Waar we vo moeten zgen is dat iedere combinatie van drie kaarten slechts eenmaal in de volopige resultaatset vo komt. Dit kunnen we vo elkaar krijgen als we de WHERE clause vervangen do deze: where cards3.cardno > cards2.cardno and cards2.cardno > cards1.cardno Met deze WHERE clause zgen we ervo dat de combinatie van kaarten uniek is. Een kaart kan niet met zichzelf in een mogelijke set vokomen en de combinatie van 1-2-3 komt slechts éénmaal vo. Weer een stapje dichter bij de oplossing. Nu is het mogelijk om uit dit resultaat de combinaties te halen die voldoen aan de regels van het spel. Eigenlijk is het heel eenvoudig. Als je één kenmerk bekijkt, zijn ze allemaal gelijk óf allemaal ongelijk. In pseudocode wdt dit dan: [kenmerk kaart 1] = [kenmerk kaart 2] èn [kenmerk kaart 2] = [kermerk kaart 3] óf [kenmerk kaart 1] <> [kenmerk kaart 2] èn [kenmerk kaart 1] <> [kenmerk kaart 3] èn [kenmerk kaart 2] <> [kenmerk kaart 3] In deze pseudocode is het niet nodig om [kenmerk kaart1] gelijk aan [kenmerk kaart3] te stellen. Als het kenmerk van kaart 1 gelijk is aan kaart 2 en het kenmerk van kaart 2 is gelijk aan het kenmerk van kaart 3, dan is automatisch ook het kenmerk van kaart 1 gelijk aan het kenmerk van kaart 3. Als we deze pseudocode vertalen naar een echte WHERE clause, dan ziet deze er als volgt uit: where ((cards1_symbol = cards2_symbol and cards1_symbol = cards3_symbol (cards1_symbol <> cards2_symbol and cards2_symbol <> cards3_ symbol and cards1_symbol <> cards3_symbol and ((cards1_col = cards2_col and cards1_col = cards3_col (cards1_col <> cards2_col and cards2_col <> cards3_col and cards1_col <> cards3_col and ((cards1_shading = cards2_shading and cards1_shading = cards3_shading (cards1_shading <> cards2_shading and cards2_shading <> cards3_ shading and cards1_shading <> cards3_shading Als we alle delen van de query samenbrengen, dan kun je alle zes de sets vinden met behulp van deze query: from ( select cards1.cardno cards1_cardno, cards1.symbol cards1_symbol, cards1.col cards1_col, cards1.shading cards1_shading, cards1.qty cards1_qty, cards2.cardno cards2_cardno, cards2.symbol cards2_symbol, cards2.col cards2_col, cards2.shading cards2_shading, cards2.qty cards2_qty, cards3.cardno cards3_cardno, cards3.symbol cards3_symbol, cards3.col cards3_col, cards3.shading cards3_shading, cards3.qty cards3_qty from cards cards1, cards cards2, cards cards3 where cards3.cardno > cards2.cardno and cards2.cardno > cards1.cardno where ((cards1_symbol = cards2_symbol and cards1_symbol = cards3_symbol (cards1_symbol <> cards2_symbol and cards2_symbol <> cards3_ symbol and cards1_symbol <> cards3_symbol and ((cards1_col = cards2_col and cards1_col = cards3_col (cards1_col <> cards2_col and cards2_col <> cards3_col and cards1_col <> cards3_col and ((cards1_shading = cards2_shading and cards1_shading = cards3_ shading (cards1_shading <> cards2_shading and cards2_shading <> cards3_shading and cards1_shading <> cards3_shading and ((cards1_qty = cards2_qty and cards1_qty = cards3_qty (cards1_qty <> cards2_qty and cards2_qty <> cards3_qty and cards1_qty <> cards3_qty der by cards1_cardno, cards2_cardno, cards3_cardno ; 1 oval red open 2 4 squiggle green solid 3 12 diamond purple striped 1 1 oval red open 2 7 oval red open 1 11 oval red open 3 2 squiggle purple solid 1 3 diamond red solid 3 9 oval green solid 2 2 squiggle purple solid 1 8 oval purple open 1 12 diamond purple striped 1 6 oval purple striped 1 8 oval purple open 1 10 oval purple solid 1 6 oval purple striped 1 9 oval green solid 2 11 oval red open 3 En hier is het resultaat van de zes sets die in de twaalf kaarten zitten. Heb je ze allemaal gevonden? 35

Kracht van Subquery Facting Subquery Facting laat je niet alleen eenzelfde statement meerdere keren gebruiken in de hoofd query, het is ook mogelijk om het resultaat van een query in een ander stukje van de WITH clause te gebruiken. Wat we nu willen doen, is een willekeurige set van twaalf kaarten nemen en hierin op zoek gaan naar verschillende sets. Allereerst moeten we de totale stock kaarten genereren. Iedere combinatie van kleur, symbool, vulling en aantal komt één keer vo in de totale stock kaarten. Het is een cartetisch product van al deze eigenschappen. Laten we eerst de kleuren definieren: with cols as (select 'red' col from dual union all select 'purple' from dual union all select 'green' from dual, symbols as (select 'diamond' symbol from dual union all select 'squiggle' from dual union all select 'oval' from dual, shadings as (select 'solid' from dual union all select 'striped' from dual union all select 'open' from dual, numbers as (select 1 qty from dual union all select 2 from dual union all select 3 from dual Nu hebben we alle kenmerken in de WITH clause staan. Do deze allemaal te combineren, krijgen we de gehele stock kaarten. Een krachtig kenmerk van Subquery Facting is dat we gebruik kunnen maken van eerder genoemde queries. Omdat het mogelijk is om meerdere named queries te gebruiken in een statement, kunnen we de overige kenmerken ook in de WITH clause opnemen. Gescheiden do een komma kunnen we meerdere kenmerken opnemen:, all_cards as ( from cols, symbols, shadings, numbers Kijk op BI-vends De BI-matrix van DB/M Bent u nog steeds op zoek naar een objectief marktoverzicht van Business Intelligence-leveranciers en hun producten? De BI-matrix van Database Magazine is een onafhankelijk, actueel overzicht van alle leveranciers van software vo Business Intelligence op de Nederlandse markt. Het is geen vergelijking van de technische aspecten van de producten. Het aanschaffen van BI-software is immers de keuze van een strategisch partnership. De BI-matrix biedt een overzicht van de kwaliteiten van de vends zelf, zonder dat daar een waardeodeel over wdt uitgesproken. U kunt do de matrix browsen do te selecteren op leveranciers en op zo n 30 criteria. Maar u kunt ook gebruikmaken van de matchmaking module, die aan de hand van do u ingegeven criteria vo u een shtlist samenstelt. Gewoon, om u te helpen een keuze te maken uit de vele uitstekende Business Intelligence-oplossingen die op de markt verkrijgbaar zijn. U bepaalt uiteindelijk zélf welke leverancier het beste bij u en uw bedrijf past. U vindt de BI-matrix op www.dbm.nl De BI-matrix van Database Magazine staat onder redactie van seni consultants bij Atos Origin. 36

Nu zijn we helemaal compleet, alle kaarten komen vo in de view all_cards. Als we deze kaarten schudden do ze te steren met behulp van DBMS_RANDOM.VALUE en vervolgens te filteren op de eerste twaalf, dan zijn we klaar om het spelletje te spelen. from ( from all_cards der by dbms_random.value where rownum <= 12 ; Als we nu beide delen samenvoegen, zowel het oplossen van de puzzel als het genereren van twaalf willekeurige kaarten, dan komt de query er als volgt uit te zien: with cols as (select 'red' col from dual union all select 'purple' from dual union all select 'green' from dual, symbols as (select 'diamond' symbol from dual union all select 'squiggle' from dual union all select 'oval' from dual, shadings as (select 'solid' shading from dual union all select 'striped' from dual union all select 'open' from dual, numbers as (select 1 qty from dual union all select 2 from dual union all select 3 from dual, all_cards as (select col, symbol, shading, qty from cols, symbols, shadings, numbers, cards as (select rownum cardno, col, symbol, shading, qty from (select col, symbol, shading, qty from all_cards der by dbms_random.value where rownum <= 12 select cards.cardno cards1_cardno, cards.symbol cards1_symbol, cards.col cards1_col, cards.shading cards1_shading, cards.qty cards1_qty, null cards2_cardno, null cards2_symbol, null cards2_col, null cards2_shading, null cards2_qty, null cards3_cardno, null cards3_symbol, null cards3_col, null cards3_shading, null cards3_qty, 'puzzle' what from cards union all from (select cards1.cardno cards1_cardno, cards1.symbol cards1_symbol, cards1.col cards1_col, cards1.shading cards1_shading, cards1.qty cards1_qty, cards2.cardno cards2_cardno, cards2.symbol cards2_symbol, cards2.col cards2_col, cards2.shading cards2_shading, cards2.qty cards2_qty, cards3.cardno cards3_cardno, cards3.symbol cards3_symbol, cards3.col cards3_col, cards3.shading cards3_shading, cards3.qty cards3_qty, 'solution' what from cards cards1, cards cards2, cards cards3 where cards3.cardno > cards2.cardno and cards2.cardno > cards1.cardno where ((cards1_symbol = cards2_symbol and cards1_symbol = cards3_symbol (cards1_symbol <> cards2_symbol and cards2_symbol <> cards3_symbol and cards1_symbol <> cards3_symbol and ((cards1_col = cards2_col and cards1_col = cards3_col (cards1_col <> cards2_col and cards2_col <> cards3_col and cards1_col <> cards3_col and ((cards1_shading = cards2_shading and cards1_shading = cards3_ shading (cards1_shading <> cards2_shading and cards2_shading <> cards3_shading and cards1_shading <> cards3_shading 37

and ((cards1_qty = cards2_qty and cards1_qty = cards3_qty (cards1_qty <> cards2_qty and cards2_qty <> cards3_qty and cards1_qty <> cards3_qty der by what, cards1_cardno, cards2_cardno, cards3_cardno ; Het complete resultaat uit de query: Het resultaat van deze query kan er dan als volgt uit zien: De puzzel (zoals die gevisualiseerd kan wden De oplossingen: Betere Ontwikkelaar Als je de twee verschillende statements met elkaar combineert, de ene om een willekeurige set van twaalf kaarten te krijgen en de andere om verschillende sets te kunnen vinden binnen de twaalf kaarten, dan hoef je zelf helemaal niets meer te doen. Maar ja, dat neemt natuurlijk wel de lol weg van het zelf puzzelen. En of je er op die manier een betere ontwikkelaar van wdt, valt te betwijfelen. Dit spel is als kaartspel te krijgen, maar je kunt het ook online spelen. SETGAME heeft een dagelijkse puzzel, net als de New Yk Times. De links naar deze sites staan onderaan dit artikel. Aangezien de feestdagen er weer aankomen, is het misschien wel een leuk idee om dit spel te vragen, dan wel te geven. Het is een leuke ontspanning en je komt nog eens achter je computer vandaan. Let op, als je dit spel met kinderen gaat spelen, dan kun je nog wel eens flink in de pan gehakt wden. Op de een of andere manier vinden kinderen heel snel een set. Misschien omdat hun gedachten nog niet gekanaliseerd wden, zoals dat bij ons gebeurt. Links Blog van Steven Feuerstein over SET: http://www.toadwld. com/community/blogs/tabid/67/entryid/289/default.aspx Dagelijkse SET puzzel op SETGAME.COM: http://www.setgame. com/set/puzzle_frame.htm New Yk Times daily Puzzle: http://www.nytimes.com/ref/ crosswds/setpuzzle.html Patrick Barel en Alex Nuijten, AMIS Services BV 38