2016-03-18 1 views
0

私は今学期にSQLを学び始めました。私は驚くべきことではありませんでしたので、ほとんどのクラスを逃しましたが、私は今日見て、私はブレーク。それは私が作成するはずのテーブルは本当に基本的なものです、私はちょうどデータを挿入した後に保持するデータをいくつかクエリを実行する必要がありますが、クエリの1つは何らかの理由で4時間を印刷していますSQLに精通しているので、私はそれを理解することはできませんが、うまくいけば、問題の原因を教えてくれますし、表の中で何が改善できるかを教えていただければ幸いです。SQLクエリは4回印刷されます/アドバイス

クエリは次のとおりです。

SELECT d.DIRECTOR_FNAME, d.Director_lname, s.studio_name 
FROM DIRECTOR d, STUDIO s, FILM f, CASTING c 
WHERE s.STUDIO_ID = f.STUDIO_ID 
AND f.FILM_ID = c.FILM_ID 
AND d.DIRECTOR_ID = c.DIRECTOR_ID 
AND f.FILM_TITLE = 'The Wolf Of Wall Street'; 

そして、ここではテーブルだ、私はおそらく全体のテーブルを配置する必要がありませんでしたが、それが今行われています。

drop table casting; 
drop table film; 
drop table studio; 
drop table actor; 
drop table director; 

CREATE TABLE studio(
studio_ID NUMBER NOT NULL, 
studio_Name VARCHAR2(30), 
PRIMARY KEY(studio_ID)); 

CREATE TABLE film(
film_ID NUMBER NOT NULL, 
studio_ID NUMBER NOT NULL, 
genre VARCHAR2(30), 
genre_ID NUMBER(1), 
film_Len NUMBER(3), 
film_Title VARCHAR2(30) NOT NULL, 
year_Released NUMBER NOT NULL, 
PRIMARY KEY(film_ID), 
FOREIGN KEY (studio_ID) REFERENCES studio); 

CREATE TABLE director(
director_ID NUMBER NOT NULL, 
director_fname VARCHAR2(30), 
director_lname VARCHAR2(30), 
PRIMARY KEY(director_ID)); 

CREATE TABLE actor(
actor_ID NUMBER NOT NULL, 
actor_fname VARCHAR2(15), 
actor_lname VARCHAR2(15), 
PRIMARY KEY(actor_ID)); 

CREATE TABLE casting(
film_ID NUMBER NOT NULL, 
actor_ID NUMBER NOT NULL, 
director_ID NUMBER NOT NULL, 
PRIMARY KEY(film_ID, actor_ID, director_ID), 
FOREIGN KEY(director_ID) REFERENCES director(director_ID), 
FOREIGN KEY(film_ID) REFERENCES film(film_ID), 
FOREIGN KEY(actor_ID) REFERENCES actor(actor_ID)); 

INSERT INTO studio (studio_ID, studio_Name) VALUES (1, 'Paramount'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (2, 'Warner Bros'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (3, 'Film4'); 
INSERT INTO studio (studio_ID, studio_Name) VALUES (4, 'Working Title Films'); 

INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (1, 1, 'Comedy', 1, 180, 'The Wolf Of Wall Street', 2013); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (2, 2, 'Romance', 2, 143, 'The Great Gatsby', 2013); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (3, 3, 'Science Fiction', 3, 103, 'Never Let Me Go', 2008); 
INSERT INTO film (film_ID, studio_ID, genre, genre_ID, film_Len, film_Title, year_Released) VALUES (4, 4, 'Romance', 4, 127, 'Pride and Prejudice', 2005); 

INSERT INTO director (director_ID, director_fname, director_lname) VALUES (1, 'Martin', 'Scorcese'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (2, 'Baz', 'Luhrmann'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (3, 'Mark', 'Romanek'); 
INSERT INTO director (director_ID, director_fname, director_lname) VALUES (4, 'Joe', 'Wright'); 

INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (1, 'Matthew', 'McConnaughy'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (2, 'Leonardo', 'DiCaprio'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (3, 'Margot', 'Robbie'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (4, 'Joanna', 'Lumley'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (5, 'Carey', 'Mulligan'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (6, 'Tobey', 'Maguire'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (7, 'Joel', 'Edgerton'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (8, 'Keira', 'Knightly'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (9, 'Andrew', 'Garfield'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (10, 'Sally', 'Hawkins'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (11, 'Judi', 'Dench'); 
INSERT INTO actor (actor_ID, actor_fname, actor_lname) VALUES (12, 'Matthew', 'Macfadyen'); 

INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (1, 1, 1); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (1, 2, 1); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (1, 3, 1); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (1, 4, 1); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (2, 2, 2); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (2, 5, 2); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (2, 6, 2); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (2, 7, 2); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (3, 5, 3); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (3, 8, 3); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (3, 9, 3); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (3, 10, 3); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (4, 5, 4); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (4, 8, 4); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (4, 11, 4); 
INSERT INTO casting (film_ID, actor_ID, director_ID) VALUES (4, 12, 4); 
+0

これは[tag:mysql]ではありません。 MySQLはNUMBERとVARCHAR2を認識しませんが、そうでなければ使用可能な例を投稿してくれてありがとう。あまりにも多くの人が "私は4行を得る。 Whuzz wrong? ";-) – PerlDuck

答えて

1

最初に質問する必要があるのは、「私が探している結果セット」です。あなたの質問は、その映画に属する各出演者の映画名が「ウォールストリートの狼​​」である監督名、監督名、およびスタジオ名を返しています。この場合、FilmId = 1の各キャストのレコードが得られるので、4つのレコードが得られます。 ActorId列を含めると、私が何を話しているかがわかります。希望があれば、もっと早く勉強することができます。

+0

私は、2つのテーブル、film_actor&film_director – Poena

0

あなたは代わりの、参加欠けている、この例では、次のとおりです。クエリ結果の重複を防止するために

SELECT d.DIRECTOR_FNAME, d.Director_lname, s.studio_name 
FROM DIRECTOR d 
INNER JOIN STUDIO s ON s.STUDIO_ID = f.STUDIO_ID 
INNER JOIN CASTING c ON d.DIRECTOR_ID = c.DIRECTOR_ID 
INNER JOIN FILM f ON f.FILM_ID = c.FILM_ID 
WHERE f.FILM_TITLE = 'The Wolf Of Wall Street'; 
+0

私は運がうまく動かないようにしようとしましたが、そのクエリの構文がどのようになっているかわかりません。 – Poena

+0

彼はONキーワードを欠いています: '...内部結合スタジオs ON s.studio_id = f.studio_id ... '等 – PerlDuck

+0

ありがとう@Perl Dog I構文が固定されました –

0

だけのSELECT DISTINCTの後に追加します。

SELECT DISTINCT d.DIRECTOR_FNAME, d.Director_lname, s.studio_name 
FROM DIRECTOR d, STUDIO s, FILM f, CASTING c 
WHERE s.STUDIO_ID = f.STUDIO_ID 
AND f.FILM_ID = c.FILM_ID 
AND d.DIRECTOR_ID = c.DIRECTOR_ID 
AND f.FILM_TITLE = 'The Wolf Of Wall Street'; 

同様に、表castingにあなたが適切な主キーは、CastingIdのようなものを追加してください必要はありません。これは、のようになります方法です。同じように、手作業でIDを書くのではなく、自動的にIDを増やしてください。

+0

castingIDに関するアドバイスをありがとうと、あなたのクエリは完全に機能しました。私は以前に研究室でDistinctを簡単に使用したことを覚えています。 – Poena

+1

誰かが条件を逃したので、(私の経験では)重複を拭き取るだけなので、私はいつも「別れた」と不快に感じます。 (そして、いいえ、私はdownvoterではありませんでした。) – PerlDuck

+1

Perl Dog、正直でありがとうございました。実際には、あなたが正しいです、それは問題を解決しないだろうと、あなたはまだ重複を得るが、それは隠されます。品質を向上させるには、クエリ自体が有意義で正確でなければなりません。実際、コアソリューションは良いクエリを作成することです。 –

関連する問題