我有以下SQL语句来选择数据库表中不存在的随机值:
select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)
完成时出现错误:列名无效。
我发现无法完成任务,请帮助。
谢谢! 威廉
答案 0 :(得分:2)
如果你想要一个保证返回值,除非表中包含所有可能的值,否则你需要在碰撞时继续产生新的randoms,如下所示:
DECLARE @NEW_DVAL AS INT;
WHILE 1=1
BEGIN
SET @NEW_DVAL = CONVERT(INT, 1 + 999999999 * RAND());
IF NOT EXISTS(SELECT * FROM dbo.MASTER_REF WHERE @NEW_DVAL = FIELD_DVAL)
BREAK;
END;
SELECT @NEW_DVAL;
答案 1 :(得分:1)
不幸的是,您不能在where子句中使用别名(“as NEW_DVAL”)。你可以这样做:
select NEW_DVAL from (
select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
) a
WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)
但是,我怀疑你的查询无论如何都不会做你想要的。 “select convert(...)”位将为您提供一行,其中“where”位将被过滤掉。
如果随机选择的新dval已经存在,则查询将不返回任何行 - 它将不会自动循环,直到找到未使用的行。
请查看K Ivanov's answer以获得解决方法。