8
votes

Est-il possible de créer un identifiant unique dans une vue SQL Server qui restera la même chose à laquelle la vue est appelée?

J'ai 10 tables que je rejoignez ensemble pour créer une vue. Je sélectionne seulement l'identifiant de chaque table, mais dans la vue, chaque identifiant peut afficher plus d'une fois, mais la combinaison de tous les identifiants sera toujours unique. Y a-t-il un moyen de créer une autre colonne dans cette vue qui sera un identifiant unique?

J'aimerais pouvoir stocker l'ID unique et l'utiliser pour interroger contre la vue afin d'obtenir tous les autres identifiants.


0 commentaires

6 Réponses :


1
votes

Non, vous ne pouvez pas le faire dans une vue, ce que vous pouvez faire est de créer une table temporaire pour contenir toutes ces informations et créer une clé ou une pièce d'identité unique pour chaque ligne.


1 commentaires

+ 1'ed. Mais s'il veut que les informations persistent, ce ne serait pas une table temporaire, ce serait une table réelle.



3
votes

Je pense que vous pouvez faire cela en utilisant Row_Number (), au moins si vous pouvez garantir une commande de la vue. Par exemple: xxx

tant que la commande reste la même, et seuls les champs sont ajoutés à la fin, l'ID sera unique.


5 commentaires

Cela ne garantira pas que les chiffres sont les mêmes à chaque fois. Si j'ai (1, 1, 1) et (3, 3, 3), ils seront respectivement 1 et 2. Si j'ajoute ensuite (2, 2, 2), la rangée (3, 3, 3) deviendra maintenant 3 et pas 2.


@Tom H: C'est pourquoi j'ai mis "si vous pouvez garantir une commande" au sommet de ma réponse :)


Garantir une commande ne le fait pas cependant. Ce n'est pas seulement l'ordre des rangées, il est également qu'aucune nouvelle ligne de lignes ne peut être ajoutée et que les lignes ne peuvent pas être modifiées. En d'autres termes, les données devraient être complètement statiques, à l'exception de l'ajout de lignes à la fin de la commande.


Oui, je ne pense malheureusement pas que je puisse garantir une commande. Selon vous, que pensez-vous de créer une table pour contenir tous les enregistrements (essentiellement seulement 10-12 identifiants) ??? Ensuite, ma seule préoccupation serait la mise à jour de ce tableau chaque trimestre lorsque la base de données est mise à jour. Des pensées sur cette solution?


@Tom H: C'est littéralement ce que ma réponse dit? @Brendo: une table fonctionne bien, tant que vous avez un moyen d'identifier de manière unique une ligne de la vue!



0
votes

Le fait que vous essayiez de faire ces points sur des problèmes beaucoup plus importants dans la conception de la base de données et / ou l'architecture d'application.

Depuis que vous avez 10 tables et que je vais deviner que le (s) concepteur (s) de la DB a giflé sur l'identité ID INT à toutes les tables que vous finirez par avoir environ (2 ^ 31) ^ 10 rangées possibles dans le Tableau.

Le seul type de données que je peux penser que cela pourrait couvrir ce nombre serait de traduire tous les entiers en cordes à 0 et les placera ensemble comme un grand caractère.

Je suppose bien que votre vrai problème ne reçoit pas cet identifiant pour une vue, mais une autre chose que vous essayez de faire, quelle est la question que vous devriez demander. Juste un hunch cependant.


1 commentaires

Oui, je suis tout à fait d'accord, malheureusement, c'est quelque chose que je suis coincé de travailler avec, à la recherche de la meilleure façon d'y aller. C'est une base de données de véhicules. Il y a donc 50 tables contenant chacune leurs propres identifiants qui peuvent tous être joints à la suivante. J'essaie simplement de rassembler les informations / ID de base afin de courir d'autres requêtes de: Vehidid, BedID, Boîtiertyleid, Dididid, DriveTypeid, Engineconfigid, etc ... vraiment pas jolie.



0
votes

Une possibilité serait d'appeler une fonction de votre vue qui calcule un code de hachage sur toutes les colonnes ID. Si vous utilisez un algorithme de hachage cryptographique décent, les chances d'une collision sont minuscules (probablement plus probables que le disque délivrerait de mauvaises données). Encore plus facile, vous pouvez bien sûr simplement concaténer les différents identifiants dans une seule pièce d'identité beaucoup plus grande, peut-être comme une colonne binaire ou varbinale.

stocker cet identifiant et être capable d'interroger contre ce serait un peu plus de travail. Je ne peux pas penser à un moyen de le calculer et de le stocker à partir d'une vue. Vous auriez probablement besoin d'une procédure stockée pour la créer en premier; Les détails dépendent fortement des spécificités de votre application.


0 commentaires

4
votes

J'ai eu un problème similaire où je devais établir une hiérarchie sur plusieurs tables. Si vous utilisez un entier comme ID dans chacune des tables, vous pouvez simplement convertir les identifiants de chaque table en variable et préfixez-les avec une lettre différente pour chaque table. Par exemple

Créez la vue EmplacementHierarchy AS CODE> P>

SELECT 'C' + CONVERT(VARCHAR,[Id]) as Id
      ,[Name]
      ,'S' + CONVERT(VARCHAR,[State]) as parent
  FROM [City]
  UNION
  SELECT 'S' + CONVERT(VARCHAR,[Id]) as Id
      ,[Name]
      ,'C' + CONVERT(VARCHAR,[Suburb]) as parent
  FROM [Suburb]


1 commentaires

@tamago Il est toujours utile pour les utilisateurs comme moi qui recherchent un sujet similaire et recherchent des réponses.



2
votes

Oui, récemment, j'ai eu la même exigence.

Lors de la création de la vue, conservez l'instruction SELECT en tant que temp_table , puis utilisez row_number () fonction sur la fonction Ce temp_table .

Voici un exemple: xxx


1 commentaires

Au lieu de Row_Number, ne pouvons-nous pas avoir une colonne unique existante de la vue définie comme identifiant unique?