我有一个信息数据库,只能使用一次。获取要导出到.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';
但是,那当然行不通,我不确定如何做到这一点!
谢谢
答案 0 :(得分:1)
您正在使用TOP
,而没有ORDER BY
。这将返回一组任意行。没有理由认为在同一查询的两次不同运行 中返回的行将返回相同的行,少了UPDATE
和SELECT
。
我建议您使用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
的内容。