我有以下表格和数据:
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代码中的注释。
这是否可以使用某些查询来实现此而不是游标?
谢谢!
答案 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