SQL встроенное предложение выбора - PullRequest
0 голосов
/ 24 марта 2020

У меня есть четыре таблицы: матч, статистика, игроки (joueurs) и команды (экипировка)

Мне нужно создать выбор, где я отображаю игроков (имя (prenom) и фамилия (nom) ), которые забили (результаты указаны в таблице матчей) против команды «LES SÉNATEURS». Я должен использовать название команды, также я не могу использовать сокращение 'ott'

CREATE TABLE equipes 
(
    codeequipe  CHAR(3) NOT NULL,
    nomequipe   VARCHAR2(50),
    codediv     CHAR(1) NOT NULL,
    ville       VARCHAR2(40),
    nbcoupes    NUMBER
);

ALTER TABLE equipes ADD CHECK (nbcoupes >= 0);

ALTER TABLE equipes 
    ADD CONSTRAINT equipes_pk PRIMARY KEY (codeequipe);

CREATE TABLE joueurs 
(
    numjoueur   NUMBER(3) NOT NULL,
    nom         VARCHAR2(30),
    prenom      VARCHAR2(30),
    codeequipe  CHAR(3)
);

ALTER TABLE joueurs 
    ADD CONSTRAINT joueurs_pk PRIMARY KEY (numjoueur);

CREATE TABLE matchs 
(
    nummatch     NUMBER(4) NOT NULL,
    datematch    DATE,
    codeequipev  CHAR(3) NOT NULL,
    codeequiper  CHAR(3) NOT NULL,
    scorev       NUMBER(2),
    scorer       NUMBER(2)
);

ALTER TABLE matchs 
    ADD CONSTRAINT matchs_pk PRIMARY KEY (nummatch);

CREATE TABLE statistiques 
(
    nummatch   NUMBER(4) NOT NULL,
    numjoueur  NUMBER(3) NOT NULL,
    nbbuts     NUMBER(3),
    nbpasse    NUMBER(3)
);

ALTER TABLE statistiques 
    ADD CONSTRAINT statistiques_pk PRIMARY KEY (numjoueur, nummatch);

ALTER TABLE matchs
    ADD CONSTRAINT codeequipev 
        FOREIGN KEY (codeequipev) REFERENCES equipes (codeequipe);

ALTER TABLE equipes
    ADD CONSTRAINT equipes_divisions_fk 
        FOREIGN KEY (codediv) REFERENCES divisions (codediv);

ALTER TABLE joueurs
    ADD CONSTRAINT joueurs_equipes_fk 
        FOREIGN KEY (codeequipe) REFERENCES equipes (codeequipe);

ALTER TABLE matchs
    ADD CONSTRAINT matchs_equipes_fk 
        FOREIGN KEY (codeequiper) REFERENCES equipes (codeequipe);

ALTER TABLE statistiques
    ADD CONSTRAINT statistiques_joueurs_fk 
        FOREIGN KEY (numjoueur) REFERENCES joueurs (numjoueur);

ALTER TABLE statistiques
    ADD CONSTRAINT statistiques_matchs_fk 
        FOREIGN KEY (nummatch) REFERENCES matchs (nummatch);

INSERT INTO equipes VALUES ('MTL', 'LES CANADIENS DE MONTRÉAl', 'E', 'MONTRÉAl', 24);
INSERT INTO equipes VALUES ('TOR', 'LES MAPLE LEAFS', 'E', 'TORONTO', 22);
INSERT INTO equipes VALUES ('OTT', 'LES SÉNATEURS', 'E', 'OTTAWA', 4);
INSERT INTO equipes VALUES ('AVL', 'LES AVALANCHES', 'O', 'COLORADO', 2);
INSERT INTO equipes VALUES ('VAN', 'LES CANUKS', 'O', 'VANCOUVER', 1);
INSERT INTO equipes VALUES ('BRU', 'LES BRUNS DE BOSTON', 'E', 'BOSTON', 13);

INSERT INTO Joueurs VALUES (1, 'PRICE', 'CAREY', 'MTL');
INSERT INTO Joueurs VALUES (2, 'MARKOV', 'ANDRÉ', 'MTL');
INSERT INTO Joueurs VALUES (3, 'SUBBAN', 'KARL', 'MTL');
INSERT INTO Joueurs VALUES (4, 'PATIORETTY', 'MAX', 'MTL');
INSERT INTO Joueurs VALUES (10, 'HAMMOND', 'ANDREW', 'OTT');
INSERT INTO Joueurs VALUES (6, 'STONE', 'MARC', 'OTT');
INSERT INTO Joueurs VALUES (9, 'TURIS', 'KYLE', 'OTT');
INSERT INTO Joueurs VALUES (7, 'GALLAGHER', 'BRANDON', 'MTL');
INSERT INTO Joueurs VALUES (8, 'TANGUAY', 'ALEX', 'AVL');
INSERT INTO Joueurs VALUES (11, 'THOMAS', 'BIL', 'AVL');
INSERT INTO Joueurs VALUES (5, 'PATOCHE', 'ALAIN', NULL);
INSERT INTO Joueurs VALUES (12, 'POIRIER', 'JUTEUX', NULL);

INSERT INTO Matchs VALUES (100, TO_DATE('18-10-30', 'YY/MM/DD'), 'MTL', 'TOR', 3 , 4);
INSERT INTO Matchs VALUES (101, TO_DATE('18-11-10', 'YY/MM/DD'), 'TOR', 'MTL', 3 , 3);
INSERT INTO Matchs VALUES (102, TO_DATE('18-10-12', 'YY/MM/DD'), 'MTL', 'OTT', 2 , 0);
INSERT INTO Matchs VALUES (103, TO_DATE('18-10-20', 'YY/MM/DD'), 'OTT', 'MTL', 0 , 1);
INSERT INTO Matchs VALUES (104, TO_DATE('18-11-30', 'YY/MM/DD'), 'MTL', 'AVL', 3 , 4);
INSERT INTO Matchs VALUES (105, TO_DATE('18-11-10', 'YY/MM/DD'), 'AVL', 'MTL', 0 , 0);
INSERT INTO Matchs VALUES (106, TO_DATE('18-12-12', 'YY/MM/DD'), 'MTL', 'VAN', 2 , 0);
INSERT INTO Matchs VALUES (107, TO_DATE('18-03-17', 'YY/MM/DD'), 'VAN', 'MTL', 3 , 1);
INSERT INTO Matchs VALUES (108, TO_DATE('18-11-30', 'YY/MM/DD'), 'OTT', 'VAN', 0 , 0);
INSERT INTO Matchs VALUES (109, TO_DATE('18-11-10', 'YY/MM/DD'), 'OTT', 'TOR', 0 , 4);
INSERT INTO Matchs VALUES (114, TO_DATE('18-10-30', 'YY/MM/DD'), 'BRU', 'TOR', 3 , 4);
INSERT INTO Matchs VALUES (115, TO_DATE('19-02-15', 'YY/MM/DD'), 'AVL', 'TOR', null , null);
INSERT INTO Matchs VALUES (120, TO_DATE('18-02-26', 'YY/MM/DD'), 'MTL', 'AVL', null , null);
INSERT INTO Matchs VALUES (121, TO_DATE('19-02-20', 'YY/MM/DD'), 'MTL', 'OTT', null , null);

INSERT INTO statistiques VALUES (100,3,2,2);
INSERT INTO statistiques VALUES (100,7,1,1);
INSERT INTO statistiques VALUES (101,3,1,0);
INSERT INTO statistiques VALUES (101,7,0,1);
INSERT INTO statistiques VALUES (101,4,1,2);
INSERT INTO statistiques VALUES (101,2,1,2);
INSERT INTO statistiques VALUES (100,4,0,2);
INSERT INTO statistiques VALUES (102,3,1,1);
INSERT INTO statistiques VALUES (102,7,1,2);
INSERT INTO statistiques VALUES (102,9,0,1);
INSERT INTO statistiques VALUES (106,4,1,1);
INSERT INTO statistiques VALUES (106,3,0,2);
INSERT INTO statistiques VALUES (106,2,1,0);
INSERT INTO statistiques VALUES (100,1,null,null);
INSERT INTO statistiques VALUES (101,1,null,null);
INSERT INTO statistiques VALUES (103,1,null,null);
INSERT INTO statistiques VALUES (102,1,null,null);

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Вы можете использовать следующий запрос из четырех таблиц, предполагая, что ни одна собственная цель не была забита:

SELECT e.nomequipe AS "Team Against", CONCAT(j.nom||' ',j.prenom) AS "Player Name", 
       SUM( NVL(s.nbbuts,0) ) AS "Total Goals Scored"
  FROM statistiques s
  LEFT JOIN joueurs j
    ON j.numjoueur = s.numjoueur
  LEFT JOIN matchs m
    ON m.nummatch = s.nummatch
  LEFT JOIN equipes e
    ON e.codeequipe = j.codeequipe  
 WHERE NVL(s.nbbuts,0)>0
   AND (( m.codeequipev = 'OTT' AND NVL(m.scorer,0)>0 )
     OR ( m.codeequiper = 'OTT' AND NVL(m.scorev,0)>0 ))
   AND j.codeequipe != 'OTT' -- indeed this line is redundant, added because no own goal occured assumption
 GROUP BY e.nomequipe, j.nom, j.prenom

, где трюк использует перекрестную логику c среди codeequipev против scorer и codeequiper против scorev.

Кстати, некоторые данные, связанные с оценками и целями, отсутствуют (пусто). Могут быть заполнены как ненулевые значения для получения хороших результатов.

Демо

0 голосов
/ 24 марта 2020
 select j.prenom, 
        j.nom, 
        e.nomequipe, 
        s.nbbuts
 from joueurs j
  join equipes e on j.codeequipe = e.codeequipe
  join statistiques s on j.NUMJOUEUR = s.NUMJOUEUR
  join matchs m on m.nummatch = s.nummatch
 where e.codeequipe in 
       (select CODEEQUIPEV from matchs 
        where m.CODEEQUIPER = 'OTT' 
        or m.CODEEQUIPEV = 'OTT')
 and rownum < 2
 order by s.nbbuts desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...