dynamique nom de la table dans l'instruction select
J'ai une série de l'histoire des tables dans une base de données oracle 9. History_table_00 contient des derniers mois de données, History_table_01 contient le mois d'avant, et History_table_02 le mois d'avant. Le mois prochain, History_table_02 sera automatiquement renommé history_table_03, history_table_01 renommé history_table_02, history_table_00 renommé history_table_01, et une nouvelle history_table_00 sera créé afin de recueillir le plus récent de l'histoire (j'espère vraiment que je suis en train de sens).
De toute façon, j'ai besoin d'écrire une instruction select qui permettra de sélectionner de façon dynamique toutes les tables d'historique. J'espère que ce ne sera pas trop compliqué, car ils partagent tous le même nom, juste ajouté au numéro séquentiel afin que je puisse découvrir les noms de table avec:
select table_name from all_tables where table_name like 'HISTORY_TABLE_%';
Ma requête standard pour chaque table va être:
select id, name, data_column_1, data_column_2 from history_table_%;
Que dois-je faire pour atteindre l'objectif de l'écriture d'une instruction sql qui sélectionne à partir de toutes les tables d'historique sans m'avoir besoin d'aller dans tous les mois et ajouter la nouvelle table? Merci pour tout ce que vous les gars peuvent fournir.
- La bonne solution ici est d'avoir une table, et d'ajouter une colonne "Année" que la première partie de la clé primaire.
- Coehoorn - peut-être que c'est un pauvre homme de partitionnement de la solution. vous ne savez jamais.
- ajouter au début de l'année à la clé primaire auront des caractéristiques de performances similaires à des tables séparées pour la plupart des cas d'utilisation
- Joel, je suis d'accord qu'un changement dans l'affectation des noms de table et de l'archivage est certainement recommandé, mais sa question d'origine est toujours intéressant. Parfois, quand quelqu'un acquiert une base de données qu'ils n'ont pas le design, ils se sont rencontré ce genre de situations. Veuillez voir ma réponse sur la façon dont cela peut être accompli.
- Je suis d'accord avec vous. Je souhaite que c'était juste une table, j'ai eu à traiter. Mais, pour quelque raison que ce soit, c'est comment il a été créé. Malheureusement, je suis coincé avec elle.
- mans partitionnement solution"... c'est drôle, mais je pense que légèrement vrai :/
- Une suggestion est que si vous avez la possibilité de modifier le schéma de base de données, vous pouvez modifier ma requête pour faire une insertion dans une nouvelle table où l'année est une colonne. Cela permettra à l'avenir de requêtes beaucoup plus facile... surtout pour celui qui l'adopte après vous.
Vous devez vous connecter pour publier un commentaire.
vous pouvez utiliser le curseur ref, mais je ne le recommande pas.
il va comme ceci
Je vous suggère de définir une vue dans laquelle vous sélectionnez toutes les tables d'historique à l'aide de
union all
et à chaque fois les tables sont renommés vous modifiez la vue ainsi.
alors vous pouvez simle SÉLECTIONNEZ * à PARTIR de history_data;
vous pouvez construire le point de vue dynamicaly avec l'aide de la suite de tresorerie:
La meilleure idée est de faire une instruction SQL dynamique qui construit une requête importante pour chacune des tables existantes dans la base de données. Donner la requête SQL suivante essayer. (veuillez pardonner mon formatage, je ne suis pas sûr de la façon de faire des sauts de lignes ici)
Une Solution Possible:
PS:je n'ai pas Oracle est installé , donc pas testé pour les erreurs de syntaxe.