데이터베이스 테이블의 임의 레코드 (T-SQL)
SQL Server 테이블에서 임의의 레코드를 검색하는 간결한 방법이 있습니까?
내 단위 테스트 데이터를 무작위로 만들고 싶으므로 테이블에서 임의의 ID를 선택하는 간단한 방법을 찾고 있습니다. 영어에서 선택은 "ID가 테이블의 가장 낮은 ID와 테이블의 가장 높은 ID 사이의 임의의 숫자 인 테이블에서 하나의 ID를 선택하십시오."입니다.
쿼리를 실행하고 null 값을 테스트 한 다음 null 인 경우 다시 실행하지 않고는이를 수행하는 방법을 알아낼 수 없습니다.
아이디어?
SQL Server 테이블에서 임의의 레코드를 검색하는 간결한 방법이 있습니까?
예
SELECT TOP 1 * FROM table ORDER BY NEWID()
설명
A NEWID()
가 각 행에 대해 생성되고 테이블이 정렬됩니다. 첫 번째 레코드 (즉, GUID가 "가장 낮은"레코드)가 반환됩니다.
메모
GUID는 버전 4부터 의사 난수로 생성됩니다.
버전 4 UUID는 진정한 난수 또는 의사 난수에서 UUID를 생성하기위한 것입니다.
알고리즘은 다음과 같습니다.
- clock_seq_hi_and_reserved의 최상위 비트 2 개 (비트 6 및 7)를 각각 0과 1로 설정합니다.
- time_hi_and_version 필드의 최상위 4 비트 (비트 12 ~ 15)를 섹션 4.1.3의 4 비트 버전 번호로 설정합니다.
- 다른 모든 비트를 무작위로 (또는 의사 무작위로) 선택한 값으로 설정합니다.
— UUID (Universally Unique IDentifier) URN 네임 스페이스-RFC 4122
대안
SELECT TOP 1 * FROM table ORDER BY RAND()
은 생각대로 작동하지 않습니다.RAND()
쿼리 당 하나의 단일 값을 반환하므로 모든 행이 동일한 값을 공유합니다.GUID 값은 의사 난수이지만 더 까다로운 응용 프로그램에는 더 나은 PRNG가 필요합니다.
일반적인 성능은 약 1,000,000 행에 대해 10 초 미만입니다. 물론 시스템에 따라 다릅니다. 인덱스에 도달하는 것은 불가능하므로 성능이 상대적으로 제한됩니다.
더 큰 테이블 TABLESAMPLE
에서는 전체 테이블을 스캔하지 않도록이를 위해 사용할 수도 있습니다 .
SELECT TOP 1 *
FROM YourTable
TABLESAMPLE (1000 ROWS)
ORDER BY NEWID()
는 ORDER BY NEWID
여전히 데이터 페이지에서 먼저 표시 만 반환 행을 방지하기 위해 필요합니다.
사용할 수는 테이블의 크기와 정의에 따라 신중하게 선택해야하며 행이 반환되지 않으면 재시도 논리를 고려할 수 있습니다. 이 기술의 배후에있는 수학 및 기술이 작은 테이블에 적합하지 않은 이유가 여기에서 설명됩니다.
또한 MIN (Id)과 MAX (Id) 사이의 임의의 ID를 얻는 방법을 시도한 다음
SELECT TOP 1 * FROM table WHERE Id >= @yourrandomid
항상 한 행을 얻습니다.
대용량 데이터를 선택하려는 경우 내가 아는 가장 좋은 방법은 다음과 같습니다.
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
출처 : MSDN
나는 내가 시도한 방법을 개선하기 위해이 게시물을 보았습니다. 나는 그것이 오래되었다는 것을 알고 있지만이 방법은 나열되지 않았습니다. 테스트 데이터를 만들고 적용하고 있습니다. 이것은 @st (두 문자 상태)로 호출 된 SP에서 "주소"에 대한 방법을 보여줍니다.
Create Table ##TmpAddress (id Int Identity(1,1), street VarChar(50), city VarChar(50), st VarChar(2), zip VarChar(5))
Insert Into ##TmpAddress(street, city, st, zip)
Select street, city, st, zip
From tbl_Address (NOLOCK)
Where st = @st
-- unseeded RAND() will return the same number when called in rapid succession so
-- here, I seed it with a guaranteed different number each time. @@ROWCOUNT is the count from the most recent table operation.
Set @csr = Ceiling(RAND(convert(varbinary, newid())) * @@ROWCOUNT)
Select street, city, st, Right(('00000' + ltrim(zip)),5) As zip
From ##tmpAddress (NOLOCK)
Where id = @csr
참고 URL : https://stackoverflow.com/questions/191342/random-record-from-a-database-table-t-sql
'programing' 카테고리의 다른 글
Laravel Query Builder를 사용하여 하위 쿼리에서 선택하는 방법은 무엇입니까? (0) | 2020.10.07 |
---|---|
객체 배열에서 React 컴포넌트 렌더링 (0) | 2020.10.07 |
WPF ListView : 항목에서 두 번 클릭 이벤트 첨부 (0) | 2020.10.07 |
H2가 메모리 내 데이터베이스에서 스키마를 자동 생성하도록 할 수 있습니까? (0) | 2020.10.07 |
git status에서 "치명적 : git 저장소 (또는 상위 디렉토리)가 아님" (0) | 2020.10.07 |