2016-11-23 3 views
0

enter image description herealle Filme anzeigen

ich SQL lerne und Ich habe Probleme, eine Abfrage ausgeführt wird. Ich habe einen Screenshot meiner aktuellen Suchanfrage gepostet und erhalte alle Ergebnisse, die ich für Filme möchte und wie ich sie haben möchte. Es zeigt nicht die Filme, die insgesamt 0 Vorstellungen haben. Wie schließe ich die Filme ein, die keine Vorführungen haben? Ich habe alle meine Abfrage zum Erstellen von Tabellen und Fremdschlüsseln enthalten.

-- -------------------------------------------------------------------------------- 
-- Options 
-- -------------------------------------------------------------------------------- 
USE dbSQL1;  -- Get out of the master database 
SET NOCOUNT ON; -- Report only errors 

-- -------------------------------------------------------------------------------- 
-- Drop Tables 
-- -------------------------------------------------------------------------------- 

    DROP TABLE TTicketPrices 
    DROP TABLE TTicketSales 
    DROP TABLE TShowings 
    DROP TABLE TTheaters 
    DROP TABLE TMovies 
    DROP TABLE TTicketTypes 
    DROP TABLE TScreenTypes 

    -- -------------------------------------------------------------------------------- 
    -- Step #1.1: Create Tables 
    -- -------------------------------------------------------------------------------- 

CREATE TABLE TTheaters 
(
     intTheaterID  INTEGER   NOT NULL 
    ,strTheater   VARCHAR(50)  NOT NULL 
    ,strTheaterAddress VARCHAR(50)  NOT NULL 
    ,strTheaterCity  VARCHAR(50)  NOT NULL 
    ,strTheaterState VARCHAR(50)  NOT NULL 
    ,CONSTRAINT TTheaters_PK PRIMARY KEY (intTheaterID) 
) 

CREATE TABLE TScreenTypes 
(
    intScreenTypeID INTEGER   NOT NULL 
    ,strScreenType  VARCHAR(50)  NOT NULL 
    ,CONSTRAINT TScreenTypes_PK PRIMARY KEY (intScreenTypeID) 
) 

CREATE TABLE TMovies 
(
    intMovieID   INTEGER   NOT NULL 
    ,strMovieName  VARCHAR(50)  NOT NULL 
    ,strDescription  VARCHAR(2000) NOT NULL 
    ,intRunningTime  INTEGER   NOT NULL 
    ,CONSTRAINT TMovies_PK PRIMARY KEY (intMovieID) 
) 

CREATE TABLE TShowings 
(
    intShowingID  INTEGER   NOT NULL 
    ,intTheaterID  INTEGER   NOT NULL 
    ,intScreenTypeID INTEGER   NOT NULL 
    ,intMovieID   INTEGER   NOT NULL 
    ,dteShowDate  DATE   NOT NULL 
    ,tmeShowTime  TIME   NOT NULL 
    ,CONSTRAINT TMovieShowings_PK PRIMARY KEY (intShowingID) 
) 

CREATE TABLE TTicketPrices 
(
    intTheaterID  INTEGER   NOT NULL 
    ,intScreenTypeID INTEGER   NOT NULL 
    ,intTicketTypeID INTEGER   NOT NULL 
    ,monTicketPrice  MONEY   NOT NULL 
    ,CONSTRAINT TTicketPrices_PK PRIMARY KEY (intTheaterID, intScreenTypeID, intTicketTypeID) 
) 

CREATE TABLE TTicketTypes 
(
    intTicketTypeID INTEGER   NOT NULL 
    ,strTicketType  VARCHAR(50)  NOT NULL --- Adult, Student, Child 
    ,CONSTRAINT TTicketTypes_PK PRIMARY KEY (intTicketTypeID) 
) 

CREATE TABLE TTicketSales 
(
    intTicketSaleID INTEGER   NOT NULL 
    ,intShowingID  INTEGER   NOT NULL 
    ,intTicketTypeID INTEGER   NOT NULL 
    ,monTicketPrice  MONEY   NOT NULL 
    ,CONSTRAINT TTicketSales_PK PRIMARY KEY (intTicketSaleID) 
) 



-- ------------------------------------------------------------------------- ------- 
-- Step #1.2: Identify and Create Foreign Keys 
-- -------------------------------------------------------------------------  ------- 
-- 
-- # Child        Parent       Column(s) 
-- - -----        ------      ----  ----- 
-- 1 TShowings       TTheaters      intTheaterID 
-- 2 TShowings       TScreenTypess     intScreenTypeID 
-- 3 TShowings       TMovies       intMovieID 
-- 4 TTicketPrices      TTheaters      intTheaterID 
-- 5 TTicketPrices      TScreenTypes     intScreenTypeID 
-- 6 TTicketPrices      TTicketTypes      intTicketTypeID 
-- 7 TTicketSales      TShowings      intShowingID 
-- 8 TTicketSales      TTicketTypes     intTicketTypeID 

-- 1 
ALTER TABLE TShowings ADD CONSTRAINT TShowings_TTheaters_FK 
FOREIGN KEY (intTheaterID) REFERENCES TTheaters (intTheaterID) 
-- 2 
ALTER TABLE TShowings ADD CONSTRAINT TShowings_TScreenTypes_FK 
FOREIGN KEY (intScreenTypeID) REFERENCES TScreenTypes (intScreenTypeID) 
-- 3 
ALTER TABLE TShowings ADD CONSTRAINT TShowings_TMovies_FK 
FOREIGN KEY (intMovieID) REFERENCES TMovies (intMovieID) 
-- 4 
ALTER TABLE TTicketPrices ADD CONSTRAINT TTicketPrices_TTheaters_FK 
FOREIGN KEY (intTheaterID) REFERENCES TTheaters (intTheaterID) 
-- 5 
ALTER TABLE TTicketPrices ADD CONSTRAINT TTicketPrices_TScreenTypes_FK 
FOREIGN KEY (intScreenTypeID) REFERENCES TScreenTypes (intScreenTypeID) 
-- 6 
ALTER TABLE TTicketPrices ADD CONSTRAINT TTicketPrices_TTicketTypes_FK 
FOREIGN KEY (intTicketTypeID) REFERENCES TTicketTypes (intTicketTypeID) 
-- 7 
ALTER TABLE TTicketSales ADD CONSTRAINT TTicketSales_TShowings_FK 
FOREIGN KEY (intShowingID) REFERENCES TShowings (intShowingID) 
-- 8 
ALTER TABLE TTicketSales ADD CONSTRAINT TTicketSale_TTicketTypes_FK 
FOREIGN KEY (intTicketTypeID) REFERENCES TTicketTypes (intTicketTypeID) 
-- ------------------------------------------------------------------------  -------- 
-- Step #1.3: Add data 
-- ------------------------------------------------------------------------  -------- 
INSERT INTO TTicketTypes (intTicketTypeID, strTicketType) 
VALUES (1, 'Adult') 
     ,(2, 'Student') 
     ,(3, 'Child') 
     ,(4, 'Senior') -- No sales for this ticket type. 

INSERT INTO TScreenTypes (intScreenTypeID, strScreenType) 
VALUES (1, 'Standard') 
    ,(2, 'Imax') 
    ,(3, '3D') 
    ,(4, '4D') -- No showings for this screen type 

INSERT INTO TTheaters (intTheaterID, strTheater, strTheaterAddress, strTheaterCity, strTheaterState) 
VALUES (1, 'Old Time Theater', '100 Main Street', 'Covington', 'KY') 
     ,(2, 'Super 8 Theater', '8 Your Street ', 'Your Town', 'OH') 
     ,(3, 'Main Street Theater', '203 High Road ', 'New Town', 'OH') 
     ,(4, 'Fun Time Theater', '20 New Avenue ', 'My Town', 'IN') -- No showings for this theater 

INSERT INTO TMovies (intMovieID, strMovieName, strDescription, intRunningTime) 
VALUES (1, 'Long Journey Home' , 'Heartfeld movie ... ', 165) 
     ,(2, 'Antartica', 'Educational movie ....', 205) 
     ,(3, 'Drama on the High Seas', 'Dramatic movie ....', 175) 
     ,(4, 'Aliens vs. Zombies', 'Scary movie about.....', 105) 
     ,(5, 'All About Penguins', 'Educational movie.....', 135) -- No showings for this movie 

INSERT INTO TShowings (intShowingID, intTheaterID, intMovieID, intScreenTypeID, dteShowDate, tmeShowTime) 
VALUES 
      (1, 1, 1, 1, '07/1/2015', '12:30') 
     ,(2, 1, 1, 1, '07/1/2015', '17:15') 
     ,(3, 1, 2, 1, '07/1/2015', '22:00') 

     ,(4, 1, 2, 1, '07/1/2015', '11:00') 
     ,(5, 1, 2, 1, '07/1/2015', '15:15') 
     ,(6, 1, 2, 3, '07/1/2015', '20:50') 
     ,(7, 1, 3, 1, '07/1/2015', '11:15') 
     ,(8, 1, 3, 1, '07/1/2015', '16:15') 
     ,(9, 1, 3, 1, '07/1/2015', '22:45') 
     ,(10, 2, 1, 2, '07/2/2015', '11:30') 
     ,(11, 2, 1, 2, '07/2/2015', '17:15') 
     ,(12, 2, 1, 2, '07/2/2015', '23:00') 
     ,(13, 2, 2, 2, '07/2/2015', '11:00') 
     ,(14, 2, 2, 1, '07/2/2015', '16:15') 
     ,(15, 2, 2, 3, '07/2/2015', '20:50') 
     ,(16, 2, 3, 1, '07/2/2015', '12:15') 
     ,(17, 2, 3, 1, '07/2/2015', '17:15') 
     ,(18, 2, 3, 1, '07/2/2015', '23:45') 
     ,(19, 2, 1, 1, '07/1/2015', '12:00') 
     ,(20, 3, 3, 3, '07/1/2015', '17:45') 
     ,(21, 3, 3, 1, '07/1/2015', '22:10') 
     ,(22, 3, 2, 1, '07/1/2015', '12:00') 
     ,(23, 3, 2, 1, '07/1/2015', '16:15') 
     ,(24, 3, 2, 1, '07/1/2015', '22:50') 
     ,(25, 3, 2, 1, '07/1/2015', '11:45') 
     ,(26, 3, 3, 2, '07/1/2015', '16:25') 
     ,(27, 3, 3, 1, '07/1/2015', '23:45') 
     ,(28, 3, 3, 1, '07/1/2015', '12:00') 
     ,(29, 1, 2, 3, '07/1/2015', '17:45') 
     ,(30, 1, 4, 1, '07/1/2015', '22:10') 
     ,(31, 1, 3, 1, '07/1/2015', '12:00') 
     ,(32, 2, 3, 1, '07/1/2015', '16:15') 
     ,(33, 2, 4, 1, '07/1/2015', '22:50') 
     ,(34, 2, 1, 1, '07/1/2015', '11:45') 
     ,(35, 3, 2, 3, '07/1/2015', '16:25') 
     ,(36, 3, 3, 1, '07/1/2015', '23:45') 
     ,(37, 1, 1, 3, '07/3/2015', '22:10') 
     ,(38, 1, 3, 1, '07/3/2015', '12:00') 
     ,(39, 2, 3, 1, '07/3/2015', '16:15') 
     ,(40, 2, 3, 2, '07/3/2015', '22:50') 
     ,(41, 2, 1, 1, '07/3/2015', '11:45') 
     ,(42, 3, 2, 3, '07/3/2015', '16:25') 
     ,(43, 3, 3, 1, '07/3/2015', '23:45') 

INSERT INTO TTicketPrices (intTheaterID, intScreenTypeID, intTIcketTypeID, monTicketPrice) 
    VALUES (1, 1, 1, 11.00) -- Standard Screen, Adult 
      ,(1, 1, 2, 8.00) -- Standard Screen, Student 
      ,(1, 1, 3, 6.50) -- Standard Screen, Child 
      ,(1, 1, 4, 7.50) -- Standard Screen, Senior 
      ,(1, 2, 1, 12.00) -- Imax Screen, Adult 
      ,(1, 2, 2, 9.00) -- Imax Screen, Student 
      ,(1, 2, 3, 7.00) -- Imax Screen, Child 
      ,(1, 2, 4, 7.25) -- IMax Screen, Senior 
      ,(1, 3, 1, 15.00) -- 3D, Adult 
      ,(1, 3, 2, 12.00) -- 3D, Student 
      ,(1, 3, 3, 10.00) -- 3D, Child 
      ,(1, 3, 4, 10.50) -- 3D Screen, Senior 
-- Theater 2 
      ,(2, 1, 1, 11.50) -- Standard Screen, Adult 
      ,(2, 1, 2, 8.50) -- Standard Screen, Student 
      ,(2, 1, 3, 6.50) -- Standard Screen, Child 
      ,(2, 2, 1, 12.50) -- Imax Screen, Adult 
      ,(2, 2, 2, 9.50) -- Imax Screen, Student 
      ,(2, 2, 3, 7.50) -- Imax Screen, Child 
      ,(2, 3, 1, 15.50) -- 3D, Adult 
      ,(2, 3, 2, 12.50) -- 3D, Student 
      ,(2, 3, 3, 10.50) -- 3D, Child 
      ,(2, 4, 1, 15.50) -- 4D, Adult 
      ,(2, 4, 2, 12.50) -- 4D, Student 
      ,(2, 4, 3, 10.50) -- 4D, Child 
-- Theater 3 
     ,(3, 1, 1, 11.50) -- Standard Screen, Adult 
     ,(3, 1, 2, 7.50) -- Standard Screen, Student 
     ,(3, 1, 3, 5.50) -- Standard Screen, Child 
     ,(3, 2, 1, 11.50) -- Imax Screen, Adult 
     ,(3, 2, 2, 9.00) -- Imax Screen, Student 
     ,(3, 2, 3, 7.00) -- Imax Screen, Child 
     ,(3, 3, 1, 15.00) -- 3D, Adult 
     ,(3, 3, 2, 13.00) -- 3D, Student 
     ,(3, 3, 3, 9.50) -- 3D, Child 

INSERT INTO TTicketSales (intTicketSaleID, intShowingID, intTicketTypeID, monTicketPrice) 
VALUES (1, 1, 1, 11) 
     ,(2, 26, 1, 11.5) 
     ,(3, 28, 1, 11.5) 
     ,(4, 5, 2, 8) 
     ,(5, 26, 3, 7)  
     ,(6, 12, 1, 12.5) 
     ,(7, 13, 2, 9.5) 
     ,(8, 7, 1, 11) 
     ,(9, 2, 2, 8) 
     ,(10, 16, 3, 6.5) 
     ,(11, 8, 1, 11) 
     ,(12, 22, 2, 7.5) 
     ,(13, 19, 3, 6.5) 
     ,(14, 17, 3, 6.5) 
     ,(15, 9, 1, 11) 
     ,(16, 21, 2, 7.5) 
     ,(17, 27, 2, 7.5) 
     ,(18, 34, 3, 6.5) 
     ,(19, 13, 3, 7.5) 
     ,(20, 11, 1, 12.5) 
     ,(21, 19, 1, 11.5) 
     ,(22, 17, 1, 11.5) 
     ,(23, 1, 2, 8) 
     ,(24, 36, 3, 5.5) 
     ,(25, 11, 2, 9.5) 
     ,(26, 17, 2, 8.5) 
     ,(27, 20, 2, 13) 
     ,(28, 21, 1, 11.5) 
     ,(29, 22, 3, 5.5) 
     ,(30, 21, 3, 5.5) 
     ,(31, 9, 3, 6.5) 
     ,(32, 7, 2, 8) 
     ,(33, 2, 1, 11) 
     ,(34, 3, 1, 11) 
     ,(35, 14, 1, 11.5) 
     ,(36, 30, 1, 15) 
     ,(37, 15, 1, 15.5) 
     ,(38, 29, 1, 15) 
     ,(39, 6, 1, 15) 
     ,(40, 27, 1, 11.5) 
     ,(41, 36, 1, 11.5) 
     ,(42, 6, 2, 12) 
     ,(43, 10, 3, 7.5) 
     ,(44, 27, 3, 5.5) 


SELECT 
     TT.intTheaterID 
    ,TT.strTheater 
    ,TM.intMovieID 
    ,TM.strMovieName 
    ,SUM(TM.intMovieID) AS intTotalMovies 
FROM 
     TTheaters  AS TT --A 
    ,TShowings  AS TS --B 
    ,TMovies  AS TM --C 
WHERE 
    --A to B 
      TT.intTheaterID  = TS.intTheaterID 

    --B to C 
    AND TS.intMovieID   = TM.intMovieID 
GROUP BY 
    TT.intTheaterID 
    ,TT.strTheater 
    ,TM.intMovieID 
    ,TM.strMovieName 

ORDER BY 
    TT.intTheaterID 
+0

Könnten Sie bitte auch hier Ihre Anfrage stellen? wenn möglich, in einem separaten Codeblock? – axlj

+0

Keine Bilder bitte. Text. – Drew

+3

Wo lernst du SQL? Niemand sollte diese altmodischen Verbindungen mehr lehren. Ich würde einen neuen Lehrer finden. –

Antwort

2

Verwenden Sie keine Joins im alten Stil. Damit ist hier eine Erklärung.

Da Sie die Anzahl der Vorführungen für jeden Film zählen möchten, müssen wir COUNT nicht SUM. Zweitens müssen wir dies auf dem richtigen Feld tun. Summieren eines eindeutigen Bezeichners ist fast NIE etwas, das getan würde, da es ein beliebiger Wert ist. Da Sie stattdessen sehen möchten, wie oft ein Film gezeigt wird, geben Sie COUNT die eindeutige Kennung an, die sich auf die Anzeige bezieht, nicht den Film selbst. COUNT(TS.intShowingID) AS totalShowings

Da schließlich ein Film 0 Vorstellungen haben kann, müssen wir die TMovies Tabelle als die Basistabelle aus, und LEFT JOIN, um es auszuwählen, verwenden, so dass wir eine der Filme nicht aus/Limit entfernen/Filter . Jetzt

 TMovies AS TM 
     LEFT JOIN TShowings TS ON TS.intMovieID = TM.intMovieID 
     LEFT JOIN TTheaters TT on TT.intTheaterID = TS.intTheaterID 

, setzen sie alle zusammen ....

SELECT 
     TT.intTheaterID 
    ,TT.strTheater 
    ,TM.intMovieID 
    ,TM.strMovieName 
    ,COUNT(TS.intShowingID) AS totalShowings 
FROM 
     TMovies AS TM 
     LEFT JOIN TShowings TS ON TS.intMovieID = TM.intMovieID 
     LEFT JOIN TTheaters TT on TT.intTheaterID = TS.intTheaterID 
GROUP BY 
    TM.intMovieID 
    ,TT.intTheaterID 
    ,TT.strTheater 
    ,TM.strMovieName 

ORDER BY 
    TT.intTheaterID 

Sie werden sehen, dass intMoveID 5 keine Theater mit ihm verbunden, weil es nicht überall gezeigt wird.

Wenn Sie alle Theater (wie das Fun Time Theater, das keine Vorführungen hat) zeigen möchten, können Sie FULL OUTER JOIN verwenden. Es gibt viele Join-Optionen, die Sie genau studieren sollten. Dies ist ein sehr wichtiger Aspekt für die strukturierte Abfragesprache.

+0

Danke für die Erklärung. Ich bin neu bei Aggregaten und Sub-Abfragen und das ist die beste Erklärung, die ich bisher erhalten habe. –

+0

Froh, dass es @BradWethington geholfen hat – scsimon