2014-02-12 38 views
2

我得到了包含这样删除所有没有改变(SQL)

| id | p_id | year | t_id | 
--------------------------- 
| 1 | 1 | 2001 | 1 | 
| 2 | 1 | 2002 | 1 | 
| 3 | 1 | 2003 | 1 | 
| 4 | 1 | 2004 | 3 | 
| 5 | 2 | 2001 | 1 | 
| 6 | 2 | 2003 | 1 | 
| 7 | 2 | 2004 | 2 | 
| 8 | 2 | 2006 | 3 | 
| 9 | 2 | 2007 | 1 | 

fiddle now
fiddle result

数据如下表player_teams现在我想删除每一个条目,其中T_ID没有改变项到年份栏中下一个较小的条目。当然p_id必须是相同的。

所以在这种情况下ID 2,3和6应予删除。

1:玩家的第一项(不要删除)
2:没有什么改变,以2001年(删除)
3:没有什么改变2002年(删除)
4:T_ID改为2003年(不要删除)
5:玩家的第一项(不要删除)
6:没什么改变,以2001年(2002年丢失)(删除)
7:T_ID改为2003年(不删除)
8:T_ID改为2004年(2005年丢失)(不要删除)
9:T_ID改为2006年(不删除)

注意,所有列的可能错过特定的值,并进行排序。

目标是只有球队每年都没有一个球员是,变化。

我不知道它是否可能与SQL或如果我必须编写一个程序,这样做。

THX

+1

为清楚起见,请邮寄所需的结果(也许是正确的DDL和/或sqlfiddle) – Strawberry

回答

3
DELETE player_teams.* 
FROM 
    player_teams LEFT JOIN (SELECT p_id, MIN(year) As min_year 
          FROM player_teams 
          GROUP BY p_id, t_id) p 
    ON player_teams.p_id = p.p_id AND player_teams.year=p.min_year 
WHERE 
    p.p_id IS NULL 

请参阅小提琴here。或者你可以用这个:

DELETE p1.* 
FROM 
    player_teams p1 INNER JOIN player_teams p2 
    ON p1.p_id=p2.p_id 
    AND p1.t_id = p2.t_id 
    AND p1.year>p2.year 

小提琴是here

编辑

如果你需要保持第9行,因为T_ID改为1,2,3,然后改回1,您需要使用更复杂的查询是这样的:

DELETE 
    player_teams.* 
FROM 
    player_teams INNER JOIN (
    SELECT p1.p_id, p1.year, MAX(p2.year) prev_year 
    FROM 
     player_teams p1 LEFT JOIN player_teams p2 
     ON p1.p_id = p2.p_id AND p1.year>p2.year 
    GROUP BY 
     p1.p_id, p1.year) ny 
    ON player_teams.p_id = ny.p_id AND 
    player_teams.year = ny.year 
    INNER JOIN player_teams pny 
    ON ny.p_id = pny.p_id 
    AND ny.prev_year=pny.year 
    AND player_teams.t_id = pny.t_id 

小提琴是here

+0

好这个工作,只要在以后的一年再次出现一个T_ID不是它已经改变了。添加条目,你需要保持连续9问题 – Cheetah

+0

@Cheetah?因为它变成了3,然后又变回了1? – fthiella

+0

是的。我需要所有的改变。 – Cheetah

0

试试看看它是否有效。

DELETE FROM Table 
WHERE id IN (SELECT id FROM Table t1 
       WHERE t1.id > id AND t1.p_id = p_id AND t_id = t1.t_id)