2010-07-09 9 views
3

활성 계정의 스트리밍 데이터 소스에서 수집 한 user_ids가있는 테이블이 있습니다. 이제는 아무 것도하지 않는 user_ids에 대한 정보를 채우려 고합니다.SQL 반환 테이블에 임의의 숫자가 없음

쿼리가 테이블에없는 임의의 숫자를 반환하도록하는 SQL (포스트 그레스가있는 경우) 방법이 있습니까? 이 같은

예 : 뭔가 :

SELECT RANDOM(count, lower_bound, upper_bound) as new_id 
WHERE new_id NOT IN (SELECT user_id FROM user_table) AS user_id_table 

가능한, 또는이 스크립트 래퍼 임의의 숫자의 무리를 생성하고 DB에 사람들을 전달하는 가장 좋은 것입니다 비 존재하지 않는 것들을 알아낼?

답변

3

확실합니다. 당신이 정수로 ID를 원하는 경우, 시도 :

SELECT trunc((random() * (upper_bound - lower_bound)) + lower_bound) AS new_id 
FROM generate_series(1,upper_bound) 
WHERE new_id NOT IN (
    SELECT user_id 
    FROM user_table) 
+1

흠, 작동해야하지만 postgres는 new_id가 존재하지 않는다고 불평합니다. 중첩 된 선택을 숫자 목록으로 바꾸는 것과 동일합니다. 아마도 DB 엔진 제한일까요? – Peck

+0

Hmmm .... 예, 분명히 postgresql의 WHERE 또는 HAVING 절에서 열 별칭을 사용할 수 없습니다. pl/pgsql을 사용하여 변수를 임의의 숫자로 설정하고, 테이블에 대해 테스트하고, 좋은 것을 얻을 때까지 반복 할 수 있습니다. –

1

당신은 부속 선택에 위의 쿼리를 포장 수, 즉

 
SELECT * FROM (SELECT trunc(random() * (upper - lower) + lower) AS new_id 
FROM generate_series(1, count)) AS x 
WHERE x.new_id NOT IN (SELECT user_id FROM user_table) 
1

을 당신이 무작위 샘플링을 원하는 생각한다. 나는 다음과 같이 할 것이다 :

SELECT s 
    FROM generate_series(1, (select max(user_id) from users) s 
    LEFT JOIN users ON s.s = user_id 
WHERE user_id IS NULL 
order by random() limit 5; 

나는 이것을 시험했지만 생각은 효과가있다. 많은 사용자가 있고 누락 된 ID가 많지 않은 경우 다른 옵션보다 성능이 좋지만 수행 한 작업이 문제가 될 수 있습니다.