从SELECT查询更新还是SET?

时间:2019-12-20 20:13:33

标签: sql sql-server database

我有一个信息数据库,只能使用一次。获取要导出到.CSV文件中的信息以供使用。我将使用以下查询,我们还有一列USED,在导出数据后(因此不会重复使用),该列应设置为YES

SELECT TOP(40000) 
    ms.website AS Website, 
    ms.company AS COMPANY, 
    ms.address AS [ADDRESS], 
    ms.city AS CITY, 
    ms.state AS [STATE], 
    ms.zip AS ZIP, 
    ms.phone AS PHONE
FROM
    [QUETABLE] as ms
WHERE  
    DEAD != 'YES' AND USED != 'YES';

然后我想到我将使用此查询来更新“ USED”列,以便如果再次运行同一查询,则只会导出新信息:

UPDATE TOP(40000) QUETABLE 
SET USED = 'YES' 
WHERE USED = 'NULL' AND DEAD != 'YES';

但是,尽管很多数据是相同的,但由于某种原因,并非所有40,0000列都匹配,这意味着未使用的数据将被标记为已使用(反之亦然),而USED列则设置为使用前为NULL(不是IS NULL,而是写为“ null”)。

如何运行顶部查询,但同时又将USED设置为“ YES”,因此信息是相同的?因此,在损坏的SQL中,就像:

SELECT TOP(40000) 
       ms.website AS Website, 
       ms.company   AS COMPANY, 
       ms.address   AS [ADDRESS], 
       ms.city      AS CITY, 
       ms.state     AS [STATE], 
       ms.zip       AS ZIP, 
       ms.phone     AS PHONE
FROM   [QUETABLE] as ms
WHERE  DEAD != 'YES' AND USED != 'YES' THEN SET USED = 'YES';

但是,那当然行不通,我不确定如何做到这一点!

谢谢

1 个答案:

答案 0 :(得分:1)

您正在使用TOP,而没有ORDER BY。这将返回一组任意行。没有理由认为在同一查询的两次不同运行 中返回的行将返回相同的行,少了UPDATESELECT

我建议您使用OUTPUT clause并以相反的顺序进行工作:

DECLARE @t TABLE ( . . . );  -- fill in the columns

UPDATE TOP(40000) QUETABLE
    SET USED = 'YES' 
    OUTPUT inserted.* INTO @t;
    WHERE USED = 'NULL' AND DEAD <> 'YES'

现在,您可以“导出”刚刚设置为DONE的内容。