2010-01-08 4 views
0

я следующую таблицу и данные:изменение «многие-ко-многим» на «один-ко-многим»

create table Foo 
(
    id int not null, 
    hid int not null, 
    value int not null 
) 

insert into Foo(id, hid, value) values(1,1,1) -- use this as 1 < 3 
insert into Foo(id, hid, value) values(1,2,3) 

insert into Foo(id, hid, value) values(2,3,3) -- use this as 3 < 5 
insert into Foo(id, hid, value) values(2,4,5) 

insert into Foo(id, hid, value) values(3,2,2) -- use this or next one as value are the same 
insert into Foo(id, hid, value) values(3,3,2) 

В настоящее время «Идентификатор» и «спрятался» имеет много-ко-многим ассоциации, я хочу добиться того, чтобы «скрыть» как «один», а не «много», правило заключается в использовании минимального «значения» в таблице, см. комментарий в вышеупомянутом коде sql.

Возможно ли использовать какой-либо запрос для достижения этого вместо курсора?

Спасибо!

+1

sql quiz? Как это викторина? –

+1

Не имеет смысла - вы говорите о связи между 'hid' и' id', но сравнение значений находится в столбце 'value'. –

ответ

2

SQL 2005:

WITH X AS (SELECT id, min(value) as minval from Foo group by id) 
SELECT * FROM 
(
    SELECT Foo.*, RANK() OVER (PARTITION by Foo.id order by Foo.hid, Foo.value) as Rank 
    FROM Foo JOIN X on Foo.id = X.id and Foo.value = X.minval 
) tmp 
WHERE Rank = 1 


id   hid   value  Rank     
----------- ----------- ----------- -------------------- 
1   1   1   1 
2   3   3   1 
3   2   2   1 

Первая линия (WITH) получает набор идентификаторов с минимальным значением (мой произвольный выбор). RANK используется для устранения дубликатов - может быть, лучший способ.

С MySql или SQL 2000, я думаю, вы могли бы сделать это со сложным набором подзапросов.

0

Не уверен, что если вы ищете для запроса или инструкции о том, как изменить схему, но вот вопрос:

select id, min(hid) as hid, min(value) as value 
from Foo 
group by id 
Смежные вопросы