SQL | Basic joins exercise | Create multiple joins to show the shortest Doctor Who episodes

This exercise is provided to allow potential course delegates to choose the correct Wise Owl Microsoft training course, and may not be reproduced in whole or in part in any format without the prior written consent of Wise Owl.

Software ==> SQL  (198 exercises)
Version ==> Any version of SQL Server
Topic ==> Basic joins  (8 exercises)
Level ==> Harder than average
Subject ==> SQL training
Before you can do this exercise, you'll need to download and unzip this file (if you have any problems doing this, click here for help).

You need a minimum screen resolution of about 700 pixels width to see our exercises. This is because they contain diagrams and tables which would not be viewable easily on a mobile phone or small laptop. Please use a larger tablet, notebook or desktop computer, or change your screen resolution settings.

If you haven't already done so, run the script in the above folder to generate the Doctor Who database.

Create a query to list out the appearances of enemies in episodes which have length under 40 characters, where the length is defined as the sum of:

  • the number of characters in the author's name;
  • the number of characters in the episode's title;
  • the number of characters in the doctor's name; and
  • the number of characters in the enemy's name.

This should reveal two episodes:

Two shortest episodes

The two episodes which make it under the very low bar.

You are now a master (or mistress) of joins!  Save this as Time for a coffee, then close it down.

You can unzip this file to see the answers to this exercise, although please remember this is for your personal use only.
This page has 2 threads Add post
15 May 22 at 21:43

The proposed solution was to sum the columns at the select part, then do the same when doing the WHERE. I was thinking about other solutions, but after carefully considering my solution: (where I encapsulated the result of the joins, then used the WHERE to filter) I'm starting to think this could create a very bad performance problem because it basically return all rows from the joins.

select * from (
    select 
        aut.AuthorName, e.Title, doc.DoctorName, enemy.EnemyName,
        ( 
            len(aut.AuthorName) +
            len(e.Title) +
            len(doc.DoctorName) +
            len(enemy.EnemyName)
        ) AS [Total Length]
    from
    tblAuthor aut
    inner join tblEpisode e
        on e.AuthorId = aut.AuthorId
    inner join tblDoctor doc
        on doc.DoctorId = e.DoctorId
    inner join tblEpisodeEnemy epen
        on E.EpisodeId = EPEN.EpisodeId
    INNER JOIN tblEnemy enemy
        on epen.EnemyId = enemy.EnemyId
) AS r
WHERE 
    r.[Total Length] < 40

My question is... would you please say if my solution is bad, and what would be the advantage of calculating during selection then repeating the calculation on the where again... thank you for all your help!

16 May 22 at 09:47

To be honest I don't know!  My gut feeling is that it would be better to do the calculation once only, as you've done.  I'll throw this question open - anyone else out there know the answer?

27 May 22 at 08:23

SELECT  tblAuthor.AuthorName, 
                tblEpisode.Title, 
                tblDoctor.DoctorName, 
                tblEnemy.EnemyName,
    (LEN(tblAuthor.AuthorName)+

    LEN(tblEpisode.Title)+
    LEN(tblDoctor.DoctorName)+ 
    LEN(tblEnemy.EnemyName))  AS  [Total Length]
    
FROM  tblEpisodeEnemy

INNER JOIN
tblEnemy ON tblEpisodeEnemy.EnemyId = tblEnemy.EnemyId

INNER JOIN
    tblAuthor

INNER JOIN
tblEpisode ON tblAuthor.AuthorId = tblEpisode.AuthorId

INNER JOIN
tblDoctor ON tblEpisode.DoctorId = tblDoctor.DoctorId 
ON tblEpisodeEnemy.EpisodeId = tblEpisode.EpisodeId

WHERE (LEN(tblAuthor.AuthorName)+LEN(tblEpisode.Title)+
    LEN(tblDoctor.DoctorName)+ 
    LEN(tblEnemy.EnemyName))  <40

 

 

 

 

First of all Use Query Editor to Create the joins among the tables tblDoctor, tblAuthor,tblEpisode, tblEnemy,tblEpisodeEnemy 
And then use len function to write query

19 Feb 19 at 21:43

For Amy's choice my enemy name says 'Winifred GillyFlower'.