2010-03-04 5 views
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... 

Любые идеи?

+3

Форматирование кода и дать больше информации. – JonH

+0

Как вы различаете школу и школу? Они предназначены для того, чтобы быть в алфавитном порядке? –

+0

Являются ли столбцы намеренными представлять (1) идентификатор студента (2) имя ученика (3) определенную дату, связанную со студентом (4), в алфавитном порядке, связанную со студентом, и (5) в алфавитном порядке Вторая школа связана со студентом? Если это так, то вы, скорее всего, захотите сделать подзаголовок для определения столбцов 4 и 5, если только не существует магии кросс-табуляции, о которой я еще не изучил. –

ответ

0

Нам потребуется дополнительная информация, такая как ваши таблицы и что вы после. Одна вещь, которую я заметил, у вас есть школа, а затем школа1. 3nf заявляет, что вы никогда не должны дублировать поля и добавлять номера к ним, чтобы получить дополнительную информацию, даже если вы считаете, что отношения будут только 1 или 2 дополнительных элемента. Вам нужно создать вторую таблицу, в которой хранится пользователь, связанный с 1 во многих школах.

+0

Я присоединяюсь к тому же столу, поэтому показана школа 1.а таблица имеет личную информацию, и она присоединяется к другим таблицам. что я пытаюсь сделать, это получить каждую информацию о человеке. – NULL

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, объединение запросов автоматически выбирать различные записи, так что флаг отчетливого не требуется) с помощью этого формата, можно легко подсчитать количество школ на одного студента, количество учащихся в школу и т.д.

Если время обработки и/или пространство для хранения являются фактором здесь, вы можете разделить его на 2 таблицы, 1 с идентификатором, именем &, а другой - с игрой & (в основном, что сказал JonH). Но если вы просто работаете над простой статистикой, этого должно быть достаточно.

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 
Смежные вопросы