1

私はこのような出力を持っています:

id  name    date        school  school1
1   john    11/11/2001  nyu ucla
1   john    11/11/2001  ucla    nyu
2   paul    11/11/2011  uft mit
2   paul    11/11/2011  mit uft

私はこれを達成したいと思います:

id  name    date        school  school1
1   john    11/11/2001  nyu ucla
2   paul    11/11/2011  mit uft

私は次のjoinように直接使用しています:

select distinct
  a.id, a.name,
  b.date,
  c.school

  a1.id, a1.name,
  b1.date,
  c1.school

from table a, table b, table c,table a1, table b1, table c1

where
a.id=b.id
and...

何か案は?

4

3 に答える 3

0

ソーステーブルと目的の出力の両方が貧弱な設計であることに同意します。ソーステーブルについてはおそらく何もできませんが、次のコードと出力をお勧めします。

Select id, name, date, school from MyTable;
union
Select id, name, date, school1 from MyTable;
(repeat as necessary)

これにより、次の形式で結果が得られます。

id  name    date        school
1   john    11/11/2001  nyu
1   john    11/11/2001  ucla
2   paul    11/11/2011  mit
2   paul    11/11/2011  uft

(注:私のバージョンのSQLでは、ユニオンクエリによって個別のレコードが自動的に選択されるため、個別のフラグは必要ありません)この形式を使用すると、生徒1人あたりの学校数、学校あたりの生徒数などを簡単に数えることができます。

ここで処理時間やストレージスペースが要因である場合は、これを2つのテーブルに分割できます。1つはID、名前、日付、もう1つはIDと学校(基本的にはJonHが言ったこと)です。ただし、単純な統計を作成しているだけの場合は、これで十分です。

于 2010-03-04T20:42:00.050 に答える
0

テーブルに何が含まれているか、何を求めているかなど、より多くの情報が必要になります。私が気づいたことの 1 つは、学校と学校 1 があることです。3nf は、関係が 1 つまたは 2 つの追加項目のみになると考えている場合でも、フィールドを複製してより多くの情報を取得するためにそれらに番号を追加してはならないと述べています。1 つから複数の学校に関連付けられたユーザーを格納する 2 番目のテーブルを作成する必要があります。

于 2010-03-04T20:06:47.280 に答える
0

この問題はあまりにも抵抗できないものだったので、私たちが扱っているデータ構造を推測しました。技術は質問で指定されていませんでした。これは Transact-SQL にあります。

create table student
(
    id int not null primary key identity,
    name nvarchar(100) not null default '',
    graduation_date date not null default getdate(),
)
go

create table school
(
    id int not null primary key identity,
    name nvarchar(100) not null default ''
)
go

create table student_school_asc
(
    student_id int not null foreign key references student (id),
    school_id int not null foreign key references school (id),
primary key (student_id, school_id)
)
go

insert into student (name, graduation_date) values ('john', '2001-11-11')
insert into student (name, graduation_date) values ('paul', '2011-11-11')
insert into school (name) values ('nyu')
insert into school (name) values ('ucla')
insert into school (name) values ('uft')
insert into school (name) values ('mit')
insert into student_school_asc (student_id, school_id) values (1,1)
insert into student_school_asc (student_id, school_id) values (1,2)
insert into student_school_asc (student_id, school_id) values (2,3)
insert into student_school_asc (student_id, school_id) values (2,4)



select
    s.id,
    s.name,
    s.graduation_date as [date],
    (select max(name) from 
        (select name, 
                RANK() over (order by name) as rank_num 
         from school sc
         inner join student_school_asc ssa on ssa.school_id = sc.id
         where ssa.student_id = s.id) s1 where s1.rank_num = 1) as school,
    (select max(name) from 
        (select name, 
                RANK() over (order by name) as rank_num 
         from school sc
         inner join student_school_asc ssa on ssa.school_id = sc.id
         where ssa.student_id = s.id) s2 where s2.rank_num = 2) as school1

from
    student s

結果:

id  name  date       school  school1 
--- ----- ---------- ------- --------
1   john  2001-11-11 nyu     ucla
2   paul  2011-11-11 mit     uft
于 2010-03-04T20:58:37.157 に答える