Limiter le nombre de lignes dans les sous-requêtes avec Teradata
Je suis nouveau sur Teradata et je suis confronté à un problème que je n'avais pas avec la précédente base de données que j'ai utilisé.
En gros, je suis en train de réduire le nombre de lignes renvoyées dans les sous-requêtes dans la clause where. Je n'ai eu aucun problème à faire cela auparavant avec le ROWNUM fonction.
Ma requête précédente était quelque chose comme:
SELECT * FROM myTable
WHERE field1 = 'foo' AND field2 in(
SELECT field2 FROM anotherTable
WHERE field3 = 'bar' AND ROWNUM<100);
Puisque je ne peux pas utiliser ROWNUM en TD, j'ai regardé pour des fonctions équivalentes, ou au moins des fonctions qui m'où je voulais, même si ils étaient pas exactement équivalents.
J'ai trouvé et essayé : la fonction ROW_NUMBER, en HAUT et en ÉCHANTILLON.
J'ai essayé la fonction ROW_NUMBER() mais Teradata ne permet pas de fonctions analytiques dans les clauses where.
J'ai essayé TOP N, mais cette option n'est pas prise en charge dans une sous-requête.
J'ai essayé de l'ÉCHANTILLON N, mais il n'est pas pris en charge dans les sous-requêtes.
Donc... je dois admettre que je suis un peu coincé à droite maintenant et je me demandais si il y avait une solution qui me permettrait de limiter le nombre de lignes renvoyées dans une sous-requête à l'aide de Teradata et qui serait assez similaire à ce que j'ai fait jusqu'à maintenant?
Aussi, si il y en a pas, comment serait-il possible de construire la requête différemment à l'utiliser de façon appropriée avec Teradata?
Merci!
OriginalL'auteur Charles | 2014-08-06
Vous devez vous connecter pour publier un commentaire.
L'utilisation limitée de l'ÉCHANTILLON ou le HAUT dans une sous-requête est sans doute parce que cela pourrait être une sous-Requête Corrélée.
Mais il y a deux solutions.
Mettre de l'ÉCHANTILLON ou de HAUT dans une Table Dérivée dans la sous-requête (donc ce ne peut pas être corrélée plus):
Ou la réécrire sous la forme d'une jointure d'une Table Dérivée:
HAUT sans ORDONNANCE EN est assez similaire à ROWNUM. Ce n'est pas aléatoire, mais en l'exécutant une 2ème fois peut toujours retourner un autre ensemble de résultats.
ÉCHANTILLON est vraiment aléatoire, à chaque fois que le retour à un résultat différent.
ROW_NUMBER est également possible à l'aide de QUALIFIER, au lieu d'OÙ, mais OLAP fonctions toujours besoin d'un certain ORDRE, il est beaucoup plus généraux.
La syntaxe pour les Mises à jour à l'aide de Tables Dérivées est mise à JOUR de l'onglet from (SELECT ...) dt JEU ... OÙ ...
Je pense que c'est ce que j'ai essayé :
UPDATE dt FROM ( SELECT TOP 100 * FROM myTable WHERE field1='value' ) AS dt SET field2 = 'foo', field3 = 'bar';
Mais j'ai toujours une erreur de syntaxe : "table dérivée non autorisé pour la mise à jour."Vous ne pouvez pas mettre à jour la Table Dérivée, essayez de UPDATE matable from ( SELECT TOP 100 * from matable where champ1='valeur' ) dt SET field2 = 'foo', field3 = "barre" OÙ la jointure entre-myTable-et-dt
Oh bien, fait beaucoup plus de sens dans mon esprit maintenant! Merci beaucoup!
OriginalL'auteur dnoeth