SQL嵌入式选择子句

问题描述 投票:0回答:2

我有四个表:比赛,统计数据,球员(青少年)和球队(设备)

我需要创建一个选择,在其中显示与LESSÉ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);
sql oracle
2个回答
0
投票
 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;

0
投票

您可以在没有得分的情况下在四个表中使用以下查询:

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

技巧是在codeequipevscorercodeequiperscorev之间使用交叉逻辑。

顺便说一句,与得分和目标有关的一些数据丢失(为空)。可能会填充为非null值,以便获得不错的结果。

Demo

© www.soinside.com 2019 - 2024. All rights reserved.