2009-02-27 7 views
0

Je crée une instruction SELECT simple dans une base de données Oracle et je dois sélectionner les colonnes dans un ordre spécifique. Exemple:Oracle DB simple SELECT où l'ordre des colonnes est important

Le tableau A contient 100 attributs, dont un «chapitre» qui se trouve quelque part dans l'ordre des colonnes de la table. J'ai besoin de sélectionner les données avec "chapitre" d'abord et les colonnes restantes après dans aucun ordre particulier. Essentiellement, ma déclaration doit lire quelque chose comme:

SELECT un.chapter, a. les colonnes restantes D'UN

De plus, je ne peux pas simplement taper:

SELECT a.chapter, a *

parce que cela va sélectionner "chapitre" deux fois

Je sais que le SQL. déclaration semble simple, mais si je sais comment résoudre ce problème, je peux extrapoler cette pensée dans des domaines plus complexes. En outre, supposons que je ne peux pas simplement faire défiler pour trouver la colonne "chapitre" et faites-la glisser au début.

Merci

+0

Vous pouvez dire "a.chapter, a. *" Car SQL ne se soucie pas que vous l'ayez choisi deux fois. C'est un peu gaspilleur, peut-être, mais très simple. –

+0

pourriez-vous trouver de nouvelles solutions récemment? Je travaille avec DBVisualizer et représente par défaut les colonnes de la table dans l'ordre de leur date de création. L'interface graphique permet simplement de faire glisser et déposer des colonnes pour définir manuellement l'ordre d'apparition. Mais quel petit, après que je redémarre DBVisualizer, il réinitialise l'ordre par défaut ... –

Répondre

4

Une façon quickie de contourner ce serait SELECT a.chapter AS chapterCol, a * FROM table a.; Cela signifie qu'il y aura un nom de colonne chapterCol (en supposant qu'il n'y a pas déjà une colonne nommée chapterCol.;))

6

Vous ne devriez pas sélectionner * dans un programme. Au fur et à mesure que votre schéma évoluera, il apportera des choses que vous ne connaissez pas encore. Pensez à ce qui se passe quand quelqu'un ajoute une colonne contenant tout le livre. La requête que vous pensiez être très bon marché commence soudainement à apporter des mégaoctets de données.

Cela signifie que ont pour spécifier chaque colonne dont vous avez besoin.

0

Sauf si vous avez une très bonne raison de le faire, vous ne devez pas utiliser SELECT * dans les requêtes. Il va casser votre application chaque fois que le schéma change.

+0

Oui, mais 100 colonnes dans la table est une raison pour vouloir utiliser '*'. On peut débattre de la qualité de la conception de la table, bien sûr ... –

+0

Je comprends l'argument et j'ai dû prendre la même décision. Il faut quelques minutes pour générer la liste des colonnes et l'insérer dans la requête, et je pense que c'est du temps bien passé. – cdonner

2

Voici comment je pourrais construire votre requête sans avoir à taper tous les noms, mais avec un effort manuel.

Commencez par "Sélectionner a.chapter"

maintenant effectuer une autre sélection sur votre base de données comme suit:

select '' || nom_colonne à partir de user_tab_cols où nom_table = votre_nom_table et nom_colonne <> 'CHAPTER';

maintenant prendre la sortie de cela, d'une manière couper-coller et l'ajouter à ce que vous avez commencé avec. Maintenant, exécutez cette requête. Ce devrait être ce que vous avez demandé.

Ta-da!

6

Le mieux est de sélectionner chaque colonne explicitement.

4

Si vous allez intégrer le 'SELECT *' dans le code du programme, alors je vous déconseille vivement de le faire. Comme indiqué par les auteurs précédents, votre configuration du code à casser si une colonne est jamais ajouté à (ou retiré de) la table. Le conseil simple est de ne pas le faire.

Si vous utilisez ceci dans les outils de développement (visualisation des données, etc.). Ensuite, je vous recommande de créer une vue avec l'ordre de colonne spécifique dont vous avez besoin. Capturez la sortie de 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS' et créez une instruction select pour la vue avec l'ordre des colonnes dont vous avez besoin.

Questions connexes