将“多对多”改为“一对多”

时间:2010-01-08 01:04:46

标签: sql

我有以下表格和数据:

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)

目前“id”和“hid”具有多对多关联,我想要实现的是将“hid”设为“one”而不是“many”,规则是使用最小值“值“在表中,请参阅上面的SQL代码中的注释。

这是否可以使用某些查询来实现此而不是游标?

谢谢!

2 个答案:

答案 0 :(得分: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子句)获取一组具有最小值的id(我的任意选择)。 RANK用于消除重复 - 可能有更好的方法。

使用MySql或SQL 2000,我猜你可以用一组复杂的子查询来做到这一点。

答案 1 :(得分:0)

不确定您是否在寻找查询或有关如何修改架构的说明,但这是一个查询:

select id, min(hid) as hid, min(value) as value
from Foo
group by id