2010-10-28 10 views
0

j'ai un tableau de chaînes que je veux écrire une requête telle querequête pour le tri par nom

  1. D'abord, il comptera le Id d'une table particulière disent produits sur la base des premiers noms de produits qui est dans le tableau

  2. si la valeur est plus d'un puis sélectionnez la partie supérieure d'un identifiant de la liste au hasard

  3. autrement si le compte est un ou zéro puis effectuer la même requête avec la valeur suivante à partir du tableau de chaînes .

tout organisme peut suggérer une requête appropriée pour cette condition

+0

Je ne peux pas respirer pendant la lecture d'une phrase si longue. – hoang

+0

Pouvez-vous l'espace un peu et d'exprimer la question dans un mode plus modulaire si/sinon/alors de la mode? J'étais perdu à la moitié de la troisième ligne. – slugster

+0

je suis désolé pour les gars – Mac

Répondre

0

Je suppose que les données du tableau sont TMP_ARRAY.

Vous avez deux ensembles produits et tableau, Vous ne pouvez extraire des produits que ceux qui se trouvent dans des tableaux. Pour cela, vous devez utiliser inner join avec la clause on appropriée, ensuite vous voulez définir ces résultats dans les groupes GROUP BY par nom de colonne, comme vous voulez opérer uniquement sur les résultats que la taille d'un groupe est supérieure à un, la clause having doit être ajoutée à la fin, vous voulez choisir parmi eux 'top' id. Et ici, nous avons un problème que vous voulez dire par «top»? Dans la base de données, les données n'ont pas d'ordre spécifique. Je suppose que c'est à peu près le plus grand, l'autre cas dans cette situation signifie un seul résultat, donc pour les deux cas, nous sélectionnons MAX (ID).

En conséquence, je suis venu avec quelque chose comme ça

SELECT MAX(ID) FROM PRODUCTS p INNER JOIN TMP_ARRAY t ON t.NAME = p.NAME GROUP BY p.NAME HAVING COUNT(ID) > 1; 

Mais je ne suis pas sûr que je l'ai eu tout comprendre correctement.