3 votes

Comment obtenir l'effet d'une vue triée de la base de données ?

J'aimerais pouvoir (effectivement) trier une vue de base de données. Je sais que, conceptuellement, l'ordre dans une vue de base de données n'est pas valable, mais je dois faire face au scénario suivant :

  • une application tierce, qui lit les données des tables de la base de données à l'aide d'une instruction select(*) from tablename.
  • l'application patrimoniale est très sensible à l'ordre des enregistrements.
  • une application que j'ai écrite pour permettre aux utilisateurs de gérer plus facilement les données des tables, mais les insertions et les suppressions de la table bouleversent naturellement l'ordre des enregistrements.

Si je modifiais l'instruction de l'ancienne application en sélectionnant (*) à partir du nom de l'onglet et en ordonnant par champ, mon problème serait résolu, mais ce n'est pas possible.

J'ai donc mis en place une table d'attente dans laquelle les données peuvent être exportées dans le bon ordre, mais cette option est gourmande en ressources, signifie que les données ne sont pas "vivantes" dans l'application existante et représente un travail supplémentaire pour les utilisateurs.

J'aimerais pouvoir obtenir une version ordonnée du tableau avec ces contraintes. Comment faire ?


Mise à jour - Je travaille avec Sybase 12.5, mais j'aimerais éviter une solution étroitement couplée avec un SGBDR spécifique - cela pourrait changer.

Je ne peux pas ajouter une clause "order by" à une vue, en raison des normes SQL mentionnées dans le document suivant cette entrée de Wikipedia

2voto

twblamer Points 201

Tout d'abord, j'ai déjà eu à travailler sur ce type de projet et c'est une vraie plaie. Toutes mes condoléances.

C'est un peu excentrique, mais si votre SGBD le prend en charge, vous pourriez peut-être créer une fonction de table définie par l'utilisateur qui effectue une sélection ordonnée à partir de votre ancienne table, puis configurer votre vue pour qu'elle sélectionne à partir de l'UDTF. Mais ce n'est pas quelque chose que j'ai déjà fait auparavant.

1voto

albertein Points 10821

C'est pas beau, mais ça marche.

CREATE VIEW OrderedTable
AS SELECT TOP (Select Count(*) from UnorderedTable) *
FROM UnorderedTable Order By field

1voto

Michael Petrotta Points 35647

Vous pouvez essayer une fonction de type tableau. Vous n'avez pas spécifié votre fournisseur de base de données, mais voici comment vous pourriez le faire en TSQL (Sql Server) :

CREATE FUNCTION orderedTable() 
RETURNS @returnTable TABLE 
    (val varchar(100)) AS
BEGIN
    insert @returnTable (val)
    select val from MyTable
    order by val desc
    RETURN 
END

GO

SELECT * FROM orderedTable

0voto

Mark Roddy Points 7568

Si je comprends bien, vous pourriez résoudre ce problème en.. :
1) Renommer le tableau original
2) Créer une vue avec le nom de la table que l'application patrimoniale interroge.
3) Définissez la vue comme une requête qui ordonne les enregistrements de la manière attendue par l'application patrimoniale.

0voto

Mark Brackett Points 46824

Dans MS Sql Server, nous pouvons bâtarder les normes et créer une vue telle que :

SELECT TOP 100 PERCENT * FROM TABLE ORDER BY 1

qui nous permet de contourner ce genre de problème. Puisque Sybase et Sql Server partagent T-SQL, je pense qu'il y a de bonnes chances que vous puissiez le faire aussi.

Vous pouvez également définir un index en grappe sur le champ par lequel il doit être ordonné. Cela forcera l'ordre de stockage, qui reviendra* dans cela comme "ordre naturel".

  • Il s'agit, il est vrai, d'un détail de mise en œuvre. Les normes SQL (ni aucun fournisseur spécifique, AFAIK) ne garantissent pas le classement sans clause order by... mais, si vous pouviez l'utiliser, vous ne poseriez pas la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X