2012-03-20 2 views
2

J'essaie de sélectionner un sous-ensemble aléatoire d'enregistrements en utilisant rand() ou newid(), mais chaque fois que je lance ce qui suit, je reçois toujours les mêmes résultats :Sélection d'un sous-ensemble aléatoire en SQL (Sybase Server IQ)

SELECT *,rand() as rid 
INTO #mytable 
FROM othertable 

select top 10 * from #mytable order by rid 

J'ai essayé toutes les variantes de cela, mais il semble que iq serveur sybase renvoie toujours la même valeur rand() quand je le fais comme ci-dessus. Quand j'essaie de faire

SELECT * FROM othertable order by newid() 

Je reçois une erreur disant qu'il est illégal d'utiliser newid() dans l'ordre.

Des suggestions?

+0

Vous voulez voir le générateur de nombres aléatoires avant de faire des appels à rand(). Je vous suggère de le mettre dans un proc stocké; Vous pouvez ensuite graver le générateur de nombres aléatoires puis exécuter la première requête. 'ORDER BY NEWID()' est spécifique à MS SQL Server, donc cela ne fonctionnerait pas dans Sybase. Le fil suivant pourrait être utile: http://database.ittoolbox.com/groups/technical-functional/sybase-l/using-the-function-rand-on-sybase-iq-1547367 –

+0

Je pense que vous voulez dire "__seed__ le générateur de nombres aléatoires "... –

Répondre

0

Les valeurs aléatoires dans le moteur IQ sont déterministes, forcer une requête via le moteur ASA comme ci-dessous (Attention: il est lent si vous avez plusieurs lignes).

select (select rand() as rnd) from mytable 
0

Vous pouvez obtenir un effet aléatoire en utilisant la fonction row_number() et les valeurs de temps actuelles. Essayez quelque chose comme ceci:

with q as (
    SELECT 
     *, 
     row_number() over (order by cPublisher) n, -- getting row number 
     DATEPART(ms, now()) t -- getting current ms value 
    FROM 
     #mytable 
) 

select top 10 
    * 
from 
    q 
order by 
    -- order by some combination t and n, for example t * n and sort it like char 
    cast(t * n as char) 
2

Dans T-SQL Sybase, la fonction système NEWID() génère lisibles par l'homme, ID unique au monde. Incluez la fonction système NEWID() dans la clause ORDER BY lors de l'émission de l'instruction SELECT sur la table cible.

Utilisation:

SELECT top 10 id from TABLE order by NEWID(); 
Questions connexes