MSSQL Server 2005를 사용하고 있습니다. 내 데이터베이스에는 "Id"와 "Name"이라는 두 개의 열과 약 2 개의 열이있는 "customerNames"테이블이 있습니다. 결과 1,000 개
매번 5 명의 고객을 무작위로 선택해야하는 기능을 만들고 있습니다. 누구나 쿼리를 실행할 때마다 임의의 5 행 (Id 및 Name)을 얻는 쿼리를 만드는 방법을 말해 줄 수 있습니까?
MSSQL Server 2005를 사용하고 있습니다. 내 데이터베이스에는 "Id"와 "Name"이라는 두 개의 열과 약 2 개의 열이있는 "customerNames"테이블이 있습니다. 결과 1,000 개
매번 5 명의 고객을 무작위로 선택해야하는 기능을 만들고 있습니다. 누구나 쿼리를 실행할 때마다 임의의 5 행 (Id 및 Name)을 얻는 쿼리를 만드는 방법을 말해 줄 수 있습니까?
답변:
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()
즉, 귀하의 질문에 대한보다 일반적인 답변을 얻으려면 모두이 페이지에 오는 것 같습니다.
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
SELECT TOP 1 column FROM table
ORDER BY NEWID()
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
SELECT column FROM table
ORDER BY RANDOM() LIMIT 1
update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID())
- 편집 : 나는 :( 의견 작업에 서식을 얻을 수 없다
여기에는 멋진 Microsoft SQL Server 2005 솔루션이 있습니다. 큰 결과 집합으로 작업하는 문제를 처리합니다 (내가 아는 질문은 아님).
큰 테이블에서 임의로 행 선택 http://msdn.microsoft.com/en-us/library/cc441928.aspx
수백만 행의 테이블이 있고 성능에 관심이 있다면 더 나은 대답이 될 수 있습니다.
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
이것은 오래된 질문이지만 행 수가 많은 테이블에 새 필드 (NEWID () 또는 ORDER BY rand ())를 적용하려고하면 비용이 많이 듭니다. 증분적이고 고유 한 ID가 있고 (구멍이없는 경우) GUID를 적용하거나 모든 단일 행과 유사하고 상위 X #을 가져 오는 대신 선택할 X ID ID를 계산하는 것이 더 효율적입니다.
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @randomId1 int, @randomId2 int, @randomId3 int, @randomId4 int, @randomId5 int
SET @randomId1 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId2 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId3 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId4 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId5 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
--select @maxValue as MaxValue, @minValue as MinValue
-- , @randomId1 as SelectedId1
-- , @randomId2 as SelectedId2
-- , @randomId3 as SelectedId3
-- , @randomId4 as SelectedId4
-- , @randomId5 as SelectedId5
select * from [TABLE] el
where el.id in (@randomId1, @randomId2, @randomId3, @randomId4, @randomId5)
더 많은 행을 선택하려면 ID와 많은 rand () 값으로 #tempTable을 채우고 각 rand () 값을 사용하여 최소-최대 값으로 조정합니다. 그렇게하면 모든 @ randomId1 ... n 매개 변수를 정의 할 필요가 없습니다. 아래에 CTE를 사용하여 초기 테이블을 채우는 예제가 포함되어 있습니다.
DECLARE @NumItems int = 100;
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @range int = @maxValue+1 - @minValue;
with cte (n) as (
select 1 union all
select n+1 from cte
where n < @NumItems
)
select cast( @range * rand(cast(newid() as varbinary(100))) + @minValue as int) tp
into #Nt
from cte;
select * from #Nt ntt
inner join [TABLE] i on i.id = ntt.tp;
drop table #Nt;
이 기사 에서 설명했듯이 SQL 결과 세트를 섞으려면 데이터베이스 별 함수 호출을 사용해야합니다.
RANDOM 함수를 사용하여 큰 결과 집합을 정렬하면 속도가 매우 느릴 수 있으므로 작은 결과 집합에서는 그렇게해야합니다.
당신은 큰 결과 세트를 섞고 이후를 제한해야하는 경우, 그것은 사용하는 등 뭔가 더 나은 오라클
SAMPLE(N)
또는TABLESAMPLE
에서 SQL 서버 또는 PostgreSQL을 대신 ORDER BY 절에서 임의의 기능.
따라서 다음과 같은 데이터베이스 테이블이 있다고 가정합니다.
그리고 song
테이블 의 다음 행 :
| id | artist | title |
|----|---------------------------------|------------------------------------|
| 1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
| 2 | HAIM | Don't Save Me (Cyril Hahn Remix) |
| 3 | 2Pac ft. DMX | Rise Of A Champion (GalilHD Remix) |
| 4 | Ed Sheeran & Passenger | No Diggity (Kygo Remix) |
| 5 | JP Cooper ft. Mali-Koa | All This Love |
Oracle에서는 DBMS_RANDOM.VALUE
다음 예제와 같이 함수 를 사용해야합니다 .
SELECT
artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE
위에서 언급 한 SQL 쿼리를 Oracle에서 실행하면 다음과 같은 결과 집합이 표시됩니다.
| song |
|---------------------------------------------------|
| JP Cooper ft. Mali-Koa - All This Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
DBMS_RANDOM.VALUE
ORDER BY 절에서 사용 하는 함수 호출로 인해 노래가 무작위 순서로 나열됩니다 .
SQL Server에서는 NEWID
다음 예제와 같이 함수 를 사용해야합니다 .
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()
위에서 언급 한 SQL 쿼리를 SQL Server에서 실행하면 다음과 같은 결과 집합이 나타납니다.
| song |
|---------------------------------------------------|
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| JP Cooper ft. Mali-Koa - All This Love |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
NEWID
ORDER BY 절에서 사용 하는 함수 호출로 인해 노래가 무작위 순서로 나열됩니다 .
PostgreSQL에서는 random
다음 예제와 같이 함수 를 사용해야합니다 .
SELECT
artist||' - '||title AS song
FROM song
ORDER BY random()
PostgreSQL에서 위에서 언급 한 SQL 쿼리를 실행할 때 다음과 같은 결과 집합을 얻게됩니다.
| song |
|---------------------------------------------------|
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
random
ORDER BY 절에서 사용 하는 함수 호출로 인해 노래가 무작위 순서로 나열됩니다 .
MySQL에서는 RAND
다음 예제와 같이 함수 를 사용해야합니다 .
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()
위에서 언급 한 SQL 쿼리를 MySQL에서 실행할 때 다음과 같은 결과 집합을 얻게됩니다.
| song |
|---------------------------------------------------|
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
RAND
ORDER BY 절에서 사용 하는 함수 호출로 인해 노래가 무작위 순서로 나열됩니다 .