Comment sélectionner au hasard un enregistrement dans une table

WBOY
Libérer: 2024-01-15 14:18:16
avant
1284 Les gens l'ont consulté

Comment sélectionner au hasard un enregistrement dans une table

Comment sélectionner aléatoirement une donnée dans une table

Méthode de lecture aléatoire Oracle de N données dans le tableau :

1) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par sys_guid()) où numéro de ligne 2) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par dbms_random.value) où numéro de ligne3) sélectionnez * from (sélectionnez * dans l'échantillon de nom de table (10) trier par trunc(dbms_random.value(0, 1000))) où rownum Description :

sample(10) signifie récupérer 10 % des données de la table. La valeur de l'échantillon doit être comprise entre [0,000001,99,999999], où sys_guid() et dbms_random.value sont toutes deux des fonctions internes

.

Remarque :

Lors de l'utilisation de la méthode sys_guid(), les mêmes enregistrements seront parfois obtenus, c'est-à-dire que l'ensemble de résultats de la requête précédente est le même. Cette situation peut être liée au système d'exploitation. Par exemple, elle est normale sous le système Windows et anormale sous le système Linux. De plus, il peut y avoir des problèmes avec la fonction sys_guid() elle-même et des recherches supplémentaires sont nécessaires.

Pour garantir que les données lues sur les différentes plateformes soient aléatoires, il est recommandé d'adopter deux solutions 2) et 3). Parmi elles, la solution 2) est la plus couramment utilisée, et la solution 3) convient pour interroger de grandes tables et extraire peu de données, et peut améliorer la vitesse de requête.

Comment extraire aléatoirement certains enregistrements d'un grand ensemble de données

Méthode de lecture aléatoire Oracle de N données dans le tableau :

1

2

3

1) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par sys_guid()) où numéro de ligne 2) sélectionnez * from (sélectionnez * dans l'ordre des noms de table par dbms_random.value) où numéro de ligne3) sélectionnez * from (sélectionnez * dans l'échantillon de nom de table (10) trier par trunc(dbms_random.value(0, 1000))) où rownum

Description :

sample(10) signifie récupérer 10 % des données de la table. La valeur de l'échantillon doit être comprise entre [0,000001,99,999999], où sys_guid() et dbms_random.value sont toutes deux des fonctions internes

.

Remarque :

Lors de l'utilisation de la méthode sys_guid(), les mêmes enregistrements seront parfois obtenus, c'est-à-dire que l'ensemble de résultats de la requête précédente est le même. Cette situation peut être liée au système d'exploitation. Par exemple, elle est normale sous le système Windows et anormale sous le système Linux. De plus, il peut y avoir des problèmes avec la fonction sys_guid() elle-même et des recherches supplémentaires sont nécessaires.

Pour garantir que les données lues sur les différentes plateformes soient aléatoires, il est recommandé d'adopter deux solutions : 2) et 3). Parmi elles, la solution 2) est la plus couramment utilisée, et la solution 3) convient pour interroger de grandes tables et extraire peu de données, et peut améliorer la vitesse de requête.

Comment interroger un enregistrement aléatoire à partir d'une table dans Oracle

La nécessité de travailler de nos jours est de récupérer aléatoirement un enregistrement d'une table relativement volumineuse. Contrairement à MS SQLSERVER, Oracle peut utiliser directement Select TOP 1 * From TABLE Order By NewID () pour le récupérer efficacement de manière aléatoire. Après beaucoup de problèmes, nous avons utilisé une table t_id avec 900 000 enregistrements et un seul champ gameid. Il n'y a pas d'index sur ce champ. La table contient une série d'enregistrements de données de 100 000 à 999 999 pour les tests :

Méthode 1.

En utilisant rownum et dbms_random.value, le temps moyen est de 5 secondes. Cette efficacité est en effet trop faible. Elle devrait convenir pour les petites tables, mais elle ne convient pas aux grandes tables.

déclarer

numéro n_id(6);

commencer

SELECT gameid into n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;

dbms_output.put_line(to_char(n_id));

fin;

/

Méthode 2.

En utilisant la syntaxe d'échantillon Oracle, en définissant l'échantillon aléatoire à 1%, le résultat prend environ 0,01, ce qui est assez rapide. Cependant, selon le site officiel, l'utilisation de la fonction de collecte d'échantillons peut produire des ensembles de résultats inexacts. le test. Mais il y a un problème, c'est que la répartition des résultats aléatoires est très inégale et que les résultats sont presque tous stockés dans 100 000 à 200 000 enregistrements. Bien que l’efficacité soit bonne, elle n’obtient pas un bon effet aléatoire. Si les résultats ne sont pas très élevés, cette méthode est plutôt bonne.

déclarer

numéro n_id(6);

commencer

SELECT gameid dans n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;

dbms_output.put_line(to_char(n_id));

fin;

/

Méthode 3.

En utilisant la syntaxe moins, obtenez d'abord au hasard un nombre aléatoire compris dans la plage du nombre total d'enregistrements dans la table, puis interrogez les deux ensembles de résultats avec une seule différence d'enregistrement via rownum, et utilisez moins pour soustraire l'enregistrement avec le nombre aléatoire dans avance.Le temps moyen Environ 1 seconde. Plus le nombre aléatoire est petit, plus la vitesse de requête est rapide. Lorsque le nombre aléatoire est de 20 000, cela prend 0,016 seconde. Bien que cette méthode

Cela peut obtenir un effet très aléatoire, mais l'efficacité n'est pas aussi bonne que celle de la méthode 2. Si l'efficacité est moyenne, vous pouvez toujours envisager de l'utiliser.

déclarer

n_count int:=0;

n_rand_num int:=0;

numéro n_id(6);

commencer

SELECT COUNT(*) INTO n_count FROM t_id;

SELECT trunc(dbms_random.value(1,n_count+1)) INTO n_rand_num FROM DUAL;

sélectionnez gameid dans n_id à partir de (SELECT gameid FROM t_id T WHERE rownum

moins

SELECT gameid FROM t_id T WHERE rownum

dbms_output.put_line(to_char(n_id));

fin;

/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:docexcel.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal