在基于集合的方法中转换游标内的if-else语句

时间:2013-06-26 08:58:25

标签: sql tsql cursor set-based

我有一个包含带if-else语句的游标的脚本,但是浏览表需要花费太多时间。 (一个79000行的表需要1h)。 所以我需要以基于集合的方法转换它。

if语句是

IF  ( 
        SELECT  count (b.key) 
          FROM general..ean a,
               general..mainframe b,
               general..hope c 
        WHERE a.ean = @ean
        AND a.c_suppression = '0' 
        AND a.key = b.key           
        AND b.key = c.key
        AND c.canal = @canal
    ) = 0

其中@ean和@canal是使用游标在每行中检索的值。浏览的表是tmp_day_house_info_corporate。 所以我需要从tmp_day_house_info_corporate检索所有行,if语句中的@info和@canal检索0。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

检查记录是否存在时,

Count非常无效,not exists

会更好
IF NOT EXISTS  ( 
        SELECT * 
          FROM general..ean a,
               general..mainframe b,
               general..hope c 
        WHERE a.ean = @ean
        AND a.c_suppression = '0' 
        AND a.key = b.key           
        AND b.key = c.key
        AND c.canal = @canal
    )

如果这是为了慢速显示您的完整查询,也许可以将其设置为基于。

答案 1 :(得分:3)

    SELECT  *
      FROM tmp_day_house_info_corporate
    WHERE not exists(
        SELECT  b.key
          FROM general..ean a,
               general..mainframe b,
               general..hope c 
        WHERE a.ean = tmp_day_house_info_corporate.ean
        AND a.c_suppression = '0' 
        AND a.key = b.key           
        AND b.key = c.key
        AND c.canal = tmp_day_house_info_corporate.canal
    )