代码之家  ›  专栏  ›  技术社区  ›  user2158168

SQL插入记录(如果不存在)

  •  6
  • user2158168  · 技术社区  · 12 年前

    我试图做的是将一个表与另一个临时表进行比较,如果记录不存在,则将其插入表中。我的问题是IF NOT EXIST似乎不正确。如果我把代码拆开,我的问题是:

    返回29个结果:

    SELECT * 
    from NO_STOCK INNER JOIN #no_stock
      ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
    WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE.
    

    这不会返回任何结果(我希望返回34):

    SELECT PRODUCT_CODE
    FROM #no_stock
    WHERE NOT EXISTS
      (SELECT * from NO_STOCK INNER JOIN #no_stock 
        ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
       WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)
    

    返回63:

    SELECT PRODUCT_CODE
    FROM #no_stock
    WHERE EXISTS 
      (SELECT * from NO_STOCK INNER JOIN #no_stock 
         ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE 
       WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)
    

    ps.使用SQL Server 2008 R2

    4 回复  |  直到 12 年前
        1
  •  6
  •   wax eagle    12 年前

    废弃子查询中的内部联接。

    您应该尝试以下操作:

     SELECT PRODUCT_CODE FROM #no_stock
     WHERE NOT EXISTS (SELECT * from NO_STOCK 
                  WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)
    

    这里不需要内部联接,因为#no_stock表在外部查询中被引用。

    您的其他查询也是如此:

     SELECT PRODUCT_CODE FROM #no_stock
     WHERE EXISTS (SELECT * from NO_STOCK 
              WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)
    

    试试这些,看看它们是否有效。

        2
  •  2
  •   vittore    12 年前

    您不需要同时存在和内部联接,以防您的product_code在两个表中都定义了记录。

    所以我假设您使用临时表作为引用,并将记录从临时表添加到表中,以防它只存在于临时表中

    所以你的查询应该是这样的

     insert into no_stock
     select * from #no_stock
     where product_code not in (select product_code from no_stock)
    
        3
  •  0
  •   Melanie    12 年前

    不要使用NOT EXISTS,而是尝试

    WHERE Product_Code NOT IN (SELECT Product_Code FROM NO_STOCK INNER JOIN #no_stock ON NO_STOCK.PRODUCT_CODE #no_stock.PRODUCT_CODE WHERE NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)
    
        4
  •  0
  •   SamuraiJack    12 年前

    试试这个。。。

    SELECT PRODUCT_CODE FROM #no_stock
    WHERE NOT EXISTS (SELECT * from NO_STOCK INNER JOIN #no_stock 
                        ON NO_STOCK.PRODUCT_CODE = #no_stock.PRODUCT_CODE)