Добавить или удалить повторную строку - PullRequest
1 голос
/ 04 марта 2010

У меня есть такой вывод:

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 как в:*

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 04 марта 2010

Я согласен со всеми остальными, что ваша исходная таблица и желаемый результат имеют плохой дизайн. Хотя вы, вероятно, ничего не можете сделать с вашей исходной таблицей, я рекомендую следующий код и вывод:

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 голосов
/ 04 марта 2010

Эта проблема была слишком непреодолимой, поэтому я просто предположил структуры данных, с которыми мы имеем дело. Технология не была указана в вопросе. Это в 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
0 голосов
/ 04 марта 2010

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

...