sql >> データベース >  >> RDS >> Oracle

ネストされた選択または結合クエリ?

    oracleのタグが複数あるため 、タグmysqlを無視しました (削除する必要があるもの。たとえば、どのDBMSを決定してください。 使用していますか、ちなみに私はすでに無関係なものを削除しましたoracle-sqldeveloper )。

    そのような選択ステートメントが必要なようです(最新のANSI-92JOINを使用することをお勧めします 構文、保守が容易で理解しやすいsumの降順で並べ替え およびrow_numberの貢献 として機能する:

    SELECT Name, Sum_Takings 
      FROM
      (
       SELECT f.Name, sum(p.Takings) Sum_Takings,
              row_number() over (ORDER BY sum(p.Takings)) as rn
         FROM Film f 
         LEFT JOIN Cinema c ON f.Cinema_ID = c.ID
         LEFT JOIN Performance p ON f.ID = p.id_film
        GROUP BY f.Name
       )
      WHERE rn = 1;
    

    DDLが追加されました 次のようなステートメント:

    SQL>  CREATE TABLE Cinema (
      2     ID     integer PRIMARY KEY NOT NULL,
      3     Title  varchar2(100) NOT NULL
      4   );
    
    Table created
    
    SQL>  CREATE TABLE Film (
      2     ID   integer PRIMARY KEY NOT NULL,
      3     Name varchar2(100) NOT NULL,
      4     Cinema_ID integer
      5       CONSTRAINT fk_Cinema_ID REFERENCES Cinema(ID)
      6   );
    
    Table created
    
    SQL>   CREATE TABLE Performance (
      2     ID      integer PRIMARY KEY NOT NULL,
      3     ID_Film integer
      4          CONSTRAINT fk_Film_ID REFERENCES Film(ID),
      5     Takings integer
      6   );
    
    Table created
    
    SQL>  INSERT ALL
      2         INTO Cinema(ID,Title) VALUES(1,'NiteHawk')
      3         INTO Cinema(ID,Title) VALUES(2,'Symphony Space')
      4         INTO Cinema(ID,Title) VALUES(3,'The Ziegfeld')
      5         INTO Cinema(ID,Title) VALUES(4,'Cinema Village')
      6       SELECT * FROM dual;
    
    4 rows inserted
    
    SQL>  INSERT ALL
      2         INTO Film(ID,Name,Cinema_ID) VALUES(1,'Citizen Kane',1)
      3         INTO Film(ID,Name,Cinema_ID) VALUES(2,'Titanic',2)
      4         INTO Film(ID,Name,Cinema_ID) VALUES(3,'Brave Heart',4)
      5         INTO Film(ID,Name,Cinema_ID) VALUES(4,'Dumb and Dummer',3)
      6         INTO Film(ID,Name,Cinema_ID) VALUES(5,'How To Train Your Dragon',2)
      7         INTO Film(ID,Name,Cinema_ID) VALUES(6,'Beetle Juice',3)
      8       SELECT * FROM dual;
    
    6 rows inserted
    
    SQL>  INSERT ALL
      2         INTO Performance VALUES(1,1,15)
      3         INTO Performance VALUES(2,1,4)
      4         INTO Performance VALUES(3,2,10)
      5         INTO Performance VALUES(4,3,1)
      6         INTO Performance VALUES(5,4,5)
      7         INTO Performance VALUES(6,3,3)
      8         INTO Performance VALUES(7,2,7)
      9         INTO Performance VALUES(8,5,7)
     10         INTO Performance VALUES(9,6,6)
     11       SELECT * FROM dual;
    
    9 rows inserted
    
    SQL> commit;
    
    Commit complete
    
    SQL> SELECT Name, Sum_Takings
      2    FROM
      3    (
      4     SELECT f.Name, sum(p.Takings) Sum_Takings,
      5            row_number() over (ORDER BY sum(p.Takings)) as rn
      6       FROM Film f
      7       LEFT JOIN Cinema c ON f.Cinema_ID = c.ID
      8       LEFT JOIN Performance p ON f.ID = p.id_film
      9      GROUP BY f.Name
     10     )
     11    WHERE rn = 1
     12  ;
    
    NAME                                                                  SUM_TAKINGS
    --------------------------------------------------------------------- -----------
    Brave Heart                                                                     4
    

    dbfiddle.ukデモ



    1. 文字列列の数値をグループ化して比較します

    2. ストアドプロシージャEXECとsp_executesqlの違いは?

    3. MySQLで1か月あたりの総売上高を計算する方法は?

    4. ダンプを使用したmysqlimport