找到最低值并使用该值更新另一个表

时间:2013-03-18 14:58:17

标签: sql performance sql-update

我在SQL中有两个表:Event和Swimstyle Event表的值为SwimstyleId,引用Swimstyle.id Swimstyle表有3个值:distance,relaycount和strokeid

通常情况下,Swimstyle表中会有30到50行之间的某些行,它会保存所有可能的值(这些值是游泳距离,如50(距离),1(重新计算),FREE(描边))。 但是,由于编程错误,现有值的查找不起作用,新结果的导入器为每个添加的事件创建了一个新的swimstyle条目... 我的Swimstyle表现在包含近20万行,其中当然是性能明智而不是最好的想法;)

要解决此问题,我想浏览所有事件,获取附加的泳道值,查找Swimstyle中具有相同距离,relaycount和strokeid值的第一个现有行,并使用该值更新Event.SwimstyleId。 / p>

完成所有操作后,我可以删除所有孤立的Swimstyle行,只留下30-50行的表格。

我一直在努力做一个查询来做到这一点,但没有到达任何地方。有人指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

如果我读得对,这两个陈述应该可以解决问题。注:我无法在任何地方尝试这一点,我对表格结构做了一些假设。

UPDATE event e
set swimstyle_id = (SELECT MIN(s_min.id)
                    FROM   swimstyle s_min,swimstyle s_cur
                    WHERE  s_min.distance   = s_cur.distance
                    AND    s_min.relaycount = s_cur.relaycount
                    AND    s_min.strokeid   = s_cur.strokeid
                    AND    s_cur.id         = e.swimstyle_id);

DELETE FROM swimstyle s
WHERE NOT EXISTS (SELECT 1 
                  FROM   event e
                  WHERE  e.swimstyle_id = s.id);