1

site_id最後の行を除くすべての重複行を更新するにはどうすればよいですか。つまり、重複したサイトIDが3つ(この場合は2つ)ある場合、最後の(3番目の)1つをそのままにして、上位2つを更新するにはどうすればよいですか?

temp_id site_id amount
1            2  200
2            2  200
3            2  200
4            3  200
5            3  200
6            4  200

CREATE TABLE #site(temp_id NUMERIC IDENTITY、site_id NUMERIC PRIMARY KEY)

INSERT INTO #site VALUES(2),(3),(4)

CREATE TABLE #temp (temp_id NUMERIC IDENTITY,
                      site_id NUMERIC FOREIGN KEY (site_id)       REFERENCES #site(site_id), 
                      amount  NUMERIC)

 INSERT INTO #temp VALUES(2,200),(2,200),(2,200),(3,200),(3,200),(4,200)

update #temp
set amount = 2
where site_id in (
select distinct table1.site_id
from #temp table1
inner join #temp table2 on table1.site_id = table2.site_id
and table1.temp_id <> table2.temp_id
)
and site_id <> (
select max(site_id)
from #temp
);


SELECT t.* FROM #temp t
JOIN #site            s ON s.site_id = t.site_id


DROP TABLE #temp
DROP TABLE #site
4

2 に答える 2

2
UPDATE temp_record
    SET …
    WHERE site_id = 2
        AND temp_id <> (SELECT MAX(temp_id)
                            FROM my_table
                            WHERE site_id = 2)

そのようなすべての行を更新したい場合temp_idは、 の一意のキーですtemp_record

UPDATE temp_record
    SET …
    WHERE temp_id NOT IN (
        SELECT MAX(temp_id)
            FROM temp_record
            GROUP BY site_id)
于 2012-12-30T22:34:09.767 に答える
2

これを行う私の好ましい方法は次のrow_number()とおりです。

with toupdate as (
     select t.*,
            row_number() over (partition by site_id order by temp_id desc) as seqnum
     from t
)
update t
    set . . .
    where seqnum = 1

詳細は書きません。別のアプローチを提供するだけです。

于 2012-12-31T00:24:51.270 に答える