2011-01-26 12 views
0

I DB를 테이블에 존재하지 않는 임의의 값을 선택하려면 다음 SQL 문했습니다 : 그것은 완료: 잘못된 열 이름이, 도와주세요

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

을 errors : 열 이름이 잘못되었습니다.

나는 그것을 끝낼 수있는 방법이 없으므로 친절하게 도와주세요.

감사합니다! 윌리엄

답변

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입니다. 당신이 보증 반환 값을 원하는 경우 테이블이 가능한 모든 값을 포함하지 않는

+0

당신이 얻을 때의 문제입니다 콜리 전은 값이 반환 될 때까지 호출자가 실행을 반복하도록 빈 레코드 세트를 반환합니다. –

+0

감사 Blorgbeard! 훌륭합니다. –

+0

@ 윌리엄 문제 없지만 - K 이바노프의 대답도보세요. 충돌이 발생하면 내 솔루션이 실패합니다. – Blorgbeard

2

, 당신은 충돌에 새로운 불규칙적, 그런 일을 생성 유지해야 승리 :

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; 
+0

는하지만, 물론, 당신은 더 나은이'SELECT' 루프 적합한 분리 (또는 잠금 힌트)와 트랜잭션 내에서'INSERT' 포장 것 - 그렇지 않으면 INSERT가 시도 될 때까지 사용되지 않은 ID 값이 다른 연결에 의해 삽입되었을 수있다. –

관련 문제