Trixa med SQL - Uppgift
Förord
Denna artikel har jag tänkt lägga upp lite annorlunda mot hur artiklar brukar fungera. Här vill jag nämligen ha hjälp av er läsare med att slutföra artikeln. Jag ska presentera ett vanligt och egentligen ganska enkelt problem, och sen vill jag ha era synpunkter och förslag på hur man kan lösa problemet i SQL. Om en vecka följer jag sedan upp artikeln med en sammanfattning av de förslag jag fått in, samt beskriver mina egna förslag till lösningar (om de inte redan tagits upp i de förslag jag får in).Innehåll
»»
»
»
Relaterade artiklar
» Trixa med SQL - Uppföljning» Verktyg för att mäta prestanda i SQL Server
Anställda och chefer
Upplägget är följande: vi har ett antal personer, där vissa är chef för några av de övriga. Tabelldefinitionen är enkel:
CREATE TABLE EMPLOYEESBOSSES
(
employee varchar(50) NOT NULL
, boss varchar(50) NULL
)
Denna tabell innehåller alla anställda, samt vem som är en persons chef (även cheferna finns med som anställda i tabellen). Varje kolumn innehåller namnet på en person. De personer som är chef för andra personer har NULL i kolumnen boss, och övriga har namnet på den person som är deras chef. För enkelhets skull förutsätter vi att det finns endast en nivå av chefer (ingen chef har någon annan chef), men jag har inte implementerat någon constraint för detta. Jag är medveten om att strukturen och användandet av denna tabell inte är optimal, men för denna uppgiften duger det.
Scriptet employeesbosses.sql som finns i den packade filen 386.zip kan hjälpa er att komma igång. Ladda ner filen och packa upp scriptet, och kör det sedan i valfri databas (eller skapa en ny om ni så önskar). Scriptet är skrivet för SQL Server, men med minimala förändringar kan det ändras till någon annan RDBMS (skriv gärna i era förslag vilken databashanterare ni använt). Det enda scriptet gör är att det skapar tabellen EMPLOYEESBOSSES, fyller den med 9600 rader samt skapar ett index på dessa. Det är dock inte nödvändigt att köra in allt detta, det är bara för att ni lättare ska kunna komma igång och experimentera med SQL-frågorna. Om ni hellre bara vill skapa tabellen och lägga in ett par rader själva går det lika bra, det är inte den exakta tiden det tar att köra frågorna vi är ute efter, utan hur de presterar inbördes mellan varandra, samt hur de löser uppgiften (se nedan). Därför är det ej heller nödvändigt att ha indexet på tabellen, eller att skapa nya index som utnyttjas bättre än det index jag använt i scriptet.
Uppgiften
Vad vi ska göra är att ta reda på vilken chef som har flest anställda direkt under sig. De flesta problem i SQL går att lösa på flera olika sätt, och det gäller förstås även denna uppgift. Jag är dels intresserad av att se lösningar som levererar resultatet på det mest optimerade viset (snabbast tid, minst I/O etc), men även lösningar som utmärker sig på andra sätt. Ett exempel kan vara enskilda frågor som exekveras för sig själv och ändå levererar svaret (i motsats till exempelvis procedurer och batchar som exekveras i flera steg).Jag vill också göra det hela intressantare på ytterligare ett sätt. Jag vill dels se lösningar som löser uppgiften specifikt i exempelvis SQL Server (eller Oracle, DB2 etc), men allra mest är jag intresserad av lösningar som löser det med enbart standard SQL. Med standard SQL menar jag i det här fallet att den ska uppfylla kraven för Core SQL-99. En lösning som följer Core SQL-99 går att köra på mer eller mindre alla större RDBMS, och därmed är det i mångas ögon en bättre lösning än en annan lösning, även om den kanske är snabbare, som är bunden till en viss databashanterare. För att se om er SQL-kod följer Core SQL-99 kan ni testa den i den utomordentligt användbara valideraren som svenska företaget Upright Database Technology har på utvecklarsidorna för sin databas Mimer SQL. Adressen dit är http://developer.mimer.com/validator/parser99/index.tml. Valideraren är webbaserad så ni behöver inte ladda ner någonting.
Lösningar
Om en vecka kommer jag att uppdatera artikeln, alternativt skriva en ny om det blir mycket feedback, med de lösningar ni har skickat in samt mina egna varianter. Som sagt, jag är intresserad av alla förslag, standard eller ej, bra eller dåliga. Skicka gärna även in de första försöken ni gör, innan ni försökt att optimera koden, så att vi kan se hur frågorna utvecklas. Om ni använder några icke-standard funktioner i någon RDBMS så beskriv gärna vad de gör.Skicka era lösningar till mig på iMail.
0 Kommentarer