2010-01-08 44 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) 

目前的 「ID」 和 「藏」 有很多-to-many關聯,我想要實現的是將「hid」設置爲「one」而不是「many」,規則是使用表中最小的「value」,參見上面的sql代碼中的註釋。

這是可能的使用某些查詢來實現這一點,而不是遊標?

謝謝!

+1

sql測驗?這是一個測驗? – 2010-01-08 01:08:52

+1

沒有意義 - 你討論'hid'和'id'之間的關係,但是值的比較在'value'列中。 – 2010-01-08 01:23:47

回答

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我想你可以用一組複雜的子查詢來做到這一點。

0

不知道,如果你正在尋找一個查詢,或者對如何修改您的架構,但這裏的指令是一個查詢:

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