首页 > 解决方案 > 用 EXISTS 替换 IN 子句会导致意外结果

问题描述

给定一个简单的表 lieu_horaire:

+ id_horaire (numeric)
+ id_lieu (numeric)
+ horaire (timestamp)

以下查询目前工作正常:

         DELETE FROM lieu_horaire where id_horaire IN ( 
         SELECT id_horaire "+
         FROM ( 
                SELECT id_horaire,
                ROW_NUMBER() OVER (PARTITION BY id_lieu order by horaire desc) AS line_number
                FROM lieu_horaire
        ) as sr
        WHERE sr.line_number > 10);

但由于可扩展性的原因,我想用 . 替换 IN 子句EXISTS '... WHERE EXISTS(... '。但是对于存在,而不是删除正确的行,它会删除所有行,就好像'... WHERE sr.line_number...'表达式不存在一样。

标签: sqlpostgresqlexists

解决方案


确保您在使用 exists 时加入了该列,如下所示:

DELETE FROM lieu_horaire where exists ( 
     SELECT id_horaire
     FROM ( 
            SELECT id_horaire,
            ROW_NUMBER() OVER (PARTITION BY id_lieu order by horaire desc) AS line_number
            FROM lieu_horaire
    ) as sr
    WHERE sr.line_number > 10 **and lieu_horaire.id_horaire=sr.id_horaire**);

推荐阅读