2017-09-28 17 views
0

편집 : 차이가있을 경우, 5.7.19를 사용하고 있습니다.subquery와 rand()를 사용하는 무작위 샘플링에서 예상치 못한 결과가 발생합니다.

테이블 A가 있는데 평균 10 %의 행을 무작위로 추출하려고합니다. 나는 서브 쿼리에서 rand()를 사용하고 그 임의의 결과를 걸러 낸다고 속임수를 쓰겠다고 결정했지만 예상치 못한 결과가 나왔다. 필터링 후 무작위로 생성 된 값을 출력 할 때 주 쿼리의 "where"절과 일치하지 않는 임의의 값을 얻습니다. 따라서 외부 선택에서 임의의 값을 재생성한다고 가정합니다.

내가 서브 쿼리와 관련이 없거나 상황이 실행될 때가 있지만 실제로 어떤 일이 일어나는지 잘 모르겠다.

내가 뭘 잘못하고 있는지 설명 할 수있는 사람이 있습니까? 나는이 게시물을 체크 아웃했다 : In which sequence are queries and sub-queries executed by the SQL engine?, 내 하위 쿼리는 상관 관계가 있으므로 내 하위 쿼리가 먼저 실행되고 기본 쿼리가 필터링되어 있다고 가정합니다. 내 가정을 감안할 때 필자는 왜 결과에 왜 걸러 내야 만하는지 이해하지 못합니다.

검색어 :

select 
    * 
from 
(
    select 
    *, 
    rand() as rand_value 
    from  
    A 
) a_rand 
where 
    rand_value < 0.1; 

결과 :

-------------------------------------- 
| id | events | rand_value   | 
-------------------------------------- 
| c |  1 | 0.5512495763145849 | <- not what I expected 
-------------------------------------- 
+0

이상하고 재현,하지만이 작동처럼 보일 않습니다. 각 테이블의 결과 중 각 테이블의 결과 중 약 10 % 만 가져오고 있지만 rand_value 열에 0.1보다 큰 값이 표시되는 이유를 모르겠습니다. 'SELECT * 이후의 서브 쿼리와 관련이 없으며, rand_value Devon

+1

귀하의 질의에는 상관 하위 쿼리, 단순히 '파생 테이블' –

+0

ps가 포함되어 있지 않습니다. https://en.wikipedia.org/wiki/Correlated_subquery –

답변

0

나는 블루 [실행 SQL]을 연결 this SQL Fiddle 사용을 사용하여 재생을 클릭 할 수없는 나는 버튼을 몇 번

CREATE TABLE Table1 
    (`x` int) 
; 

INSERT INTO Table1 
    (`x`) 
VALUES 
    (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1) 
; 

검색어 1 :

select 
    * 
from (
     select 
      * 
      , rand() as rand_value 
     from Table1 
    ) a_rand 
where 
    rand_value < 0.1 

[결과] :

| x |   rand_value | 
|---|---------------------| 
| 1 | 0.03006686086772649 | 
| 1 | 0.09353976332912199 | 
| 1 | 0.08519635823107917 |