3

私は3つのテーブル、大学、学生、結果を持っています

create table college
(
clg_id int,
clg_name varchar2()50,
insert into college values(1,'GIFT');
insert into college values(2,'GITA');
insert into college values(3,'MIT');

create table student
(
clg_id int,
regno int,
sname varchar2(50)
)

insert into student values(1,10,sahar);
insert into student values(2,11,raj);
insert into student values(3,12,Payal);
insert into student values(3,13,Monalisha);
insert into student values(2,14,mary);

create table Result
(
clg_id int,
sname varchar2(50),
clg_name varchar2(50),
regno int,
dt date,
result varchar2(30)
)

insert into Result values(1,'sahar',10,'GIFT',20-02-1990,'A+');
insert into Result values(2,'raj',11,'GITA',21-02-1991,''B+);
insert into Result values(3,'monalisha',13,'MIT',22-09-2005,'A++');
insert into Result values(3,'payal',14,'MIT',22-09-2005,'C');

ブラウザから特定の名前を入力し、学生名、大学名、および結果が保存された日付を表示しdtたいと思います。clg_idresultregno

例:入力するclg_id = 3dt = 22-09-2005、次のように表示されます。

 clg_name   sname      regno    result      
 MIT       monalisha   13        A++     
 MIT       payal        14       C      

私はたくさん試しました...私の試みの1つは

SELECT college.clg_name,student.sname,
student.regno result.result  FROM college,student,result
WHERE college.clg_id=student.clg_id=result.date;

しかし、それは間違っています...助けてください。

4

1 に答える 1

10

さて、これを行うために、実際に3つのテーブルで結合する必要はありません。私は次のように2で行うことができます。暗黙的な結合構文ではなく、明示的な結合構文を使用していることに注意してください。これは数十年前から存在しており、実際に使用する必要があります。

select r.clg_name, s.sname, r.regno, r.result
  from result r
  join student s
    on r.regno = s.regno
 where r.clg_id = 3
   and r.dt = to_date('22-09-2005','dd-mm-yyyy')

これを示すために、 SQLフィドルも作成しました。

データベースを部分的に非正規化し、情報を複製しているため、2つの結合でこれを行うことができます。これにより、不整合が発生する可能性があります。表resultでは、列snameclg_name、は必要ありません。また、学生が1つの大学にしか登録できない場合は、clg_idどちらも必要ありません。

これらの列を削除することにより、データベースがデータの誤った入力を許可しないようにし、長期的には多くの手間を省くことができます。これの本当に良い例は、スキーマの作成です。テーブルでresultはPayalはregno14ですが、テーブルではregno12studentです。

データベースを適切に正規化する(そして上記の間違いを修正する)場合、クエリは次のようになります。少し混乱を少なくするために、いくつかの命名規則を変更したことに注意してください。

select c.name, s.name, s.id, r.result
  from colleges c
  join students s
    on c.id = s.college_id
  join results r
    on s.id = r.student_id
 where c.id = 3
   and r.dt =  to_date('22-09-2005','dd-mm-yyyy')

これもSQLFiddleにあるそのクエリのスキーマです。私があなた自身に加えた変更に注意してください:

  1. 標準化された命名規則。
  2. int-> integer
  3. テーブルには複数の生徒がいるstudentので、名前(およびその他)を複数形にしました。
  4. 主キーと外部キーの制約-整合性を維持するために非常に重要です。結果は、大学に属している必要がある学生に属している必要があります。
  5. 日付を間違って入力していたことにも注意してください。暗黙の変換に依存することはなく、常に明示的に実行してください
  6. 不要な列の削除。
  7. resultsテーブルに主キーを追加しました。これは代理キーです。つまり、データとは関係ありませんが、テーブルには常に主キーが必要です。に一意の制約を追加することもできstudent_id, dtますが、ポイント8で概説したオプションをお勧めします。
  8. 私はあなたがさらに別のテーブルを必要とするだろうと思っていたでしょうexams、そしてexam_id、の外部キーとして持っていますresults。私はこれを追加していませんが、それは考えるべきことです。
  9. 学生名が最大になりました。名前で言うことはできません。過度に制限しないことが最善です。
create table colleges
(
    id integer,
    name varchar2(50),
    constraint pk_colleges primary key ( id )
  );

create table students
(
    id integer,
    name varchar2(4000), -- Use the maximum. Names are impossible to predict
    college_id integer,
    constraint pk_students primary key ( id ),
    constraint fk_student_college foreign key ( college_id )
       references colleges ( id )
);

create table Results
(
    id integer,
    student_id integer,
    dt date,
    result varchar2(30),
    constraint pk_results primary key ( id ),
    constraint fx_result_student foreign key ( student_id )
       references students ( id )
);

参考文献:

于 2012-04-21T12:44:16.103 に答える