2016-11-23 4 views
0

enter image description hereПоказать все фильмы в каждом театральном запросе

Я учусь SQL и у меня возникли проблемы при запуске запроса. Я опубликовал снимок экрана моего текущего запроса, и я получаю все результаты, которые я хочу для фильмов, и как я их хочу. Он не показывает фильмы, в которых есть всего 0 показов. Как включить фильмы, у которых нет показов? Я включил весь мой запрос для создания таблиц и внешних ключей.

-- -------------------------------------------------------------------------------- 
-- 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

Не могли бы вы также разместить свой запрос здесь? если возможно, в отдельный блок кода? – axlj

+0

Никаких фотографий, пожалуйста. Текст. – Drew

+3

Где вы изучаете SQL? Никто больше не должен учить эти старые стили. Я бы нашел нового учителя. –

ответ

2

Не используйте соединения старого стиля. С этим, вот объяснение.

Поскольку вы хотите подсчитать количество показаний для каждого фильма, нам необходимо COUNT не SUM. Во-вторых, нам нужно сделать это в правильном поле. Суммирование уникального идентификатора - это почти НИКОГДА что-то, что было бы сделано, поскольку это произвольное значение. Вместо этого, поскольку вы хотите посмотреть, сколько раз отображается фильм, COUNT уникальный идентификатор, связанный с показом, а не сам фильм. COUNT(TS.intShowingID) AS totalShowings

Наконец, поскольку фильм может иметь 0 показов, мы должны использовать TMovies таблицы в качестве базовой таблицы, чтобы выбрать из, и LEFT JOIN к нему так, что мы не удаляем/предела/фильтровать любого из фильмов, выполненных ,

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

Теперь соберем все вместе ....

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 

Вы увидите, что intMoveID 5 не имеет театры, связанные с ним, потому что он не показывается в любом месте.

Если вы хотите показать все театры (например, в театре Fun Time, который не имеет показаний), вы можете использовать FULL OUTER JOIN. Есть много вариантов соединения, над которыми вам следует много учиться. Это очень важный аспект для структурированного языка запросов.

+0

Спасибо за объяснение. Я новичок в агрегатах и ​​подзапросах, и это лучшее объяснение, которое я получил. –

+0

Рад, что это помогло @BradWhatton – scsimon

Смежные вопросы