此T-SQL查询已完成,但有错误:列名无效,请帮忙

时间:2011-01-26 02:19:54

标签: sql-server tsql

我有以下SQL语句来选择数据库表中不存在的随机值:

select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)

完成时出现错误:列名无效。

我发现无法完成任务,请帮助。

谢谢! 威廉

2 个答案:

答案 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以获得解决方法。