Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2007, 00h43   #1
Invité régulier
 
Inscription : février 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 28
Points : 7
Points : 7
Par défaut [Problème] obtenir la table d'une colonne d'une requête

Bonjour tout le monde

alors alors, voici ce que j'utilise :
- base postgres
- driver postresql avec Java

Ce que j'essaye de faire en vain, c'est obtenir la table d'une colonne qui provient du résultat d'une requête. Je cherche une solution sans avoir à parser ma requête en tant que chaîne de caractère.

Si j'ai la requête :
Code :
SELECT col1, col2, col3 FROM tab1,tab2
Comment savoir à quelle table appartient col1, col2 ou col3 ?
j'ai voulu essayer la classe ResultSetMetaData, mais cela ne le permet pas sur une telle requête.

je vous remercie d'avance si vous avez une idée ou une solution
nozostan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2007, 22h49   #2
Invité de passage
 
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 1
Points : 1
Faudrait savoir ce que tu essais de faire. En principe, rien n'empêche le même nom de colonne d'être utilisé dans deux tables différentes. En fait, le vrai nom unique d'une colonne est composé du nom du schemas, de la table et du nom de la colonne (eg, public.employee.name).

Mais si tu veux juste accéder aux noms des colonnes (qui peuvent être des alias), tu peux les extraires des métadonnées du ResultSet

(J'ai piqué ce code ici : http://www.devx.com/dbzone/Article/27992/1954?pf=true)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from EMPLOYEE");
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
 
int numColumns = resultSetMetaData.getColumnCount();
FOR (int i=1; i<(numColumns+1); i++)
{
String columnName = resultSetMetaData.getColumnName(i);
	String columnTypeName = resultSetMetaData.getColumnTypeName(i);
	int columnPrecision = resultSetMetaData.getPrecision(i);
	int columnScale = resultSetMetaData.getScale(i);
	System.out.println(columnName + ": " +  columnTypeName + " - " 
		+ " Precision: " + columnPrecision + ", " + " Scale: " 
		+ columnScale); 
}
d'un autre coté, si tu veux simplement connaitre la structure des tables, cette information est aussi disponible par les métadonnées (http://java.sun.com/j2se/1.4.2/docs/...eMetaData.html) ou par en faisant une requêtes dans le tables systèmes de postgresql



pour avoir les tables : select * from pg_tables

pour avoir les colonnes : select * from pg_attribute (en faisant une jointure avec pg_tables, on a la vue complète)
denevers est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h42   #3
Invité régulier
 
Inscription : février 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 28
Points : 7
Points : 7
oups désolé de ce retour tardif. merci en tout cas de ce début de précision

En fait j'ai besoin d'une information de ce ResultSetMetaData, et la fonction dont j'ai besoin est getTableName(int i) qui va en fait retourner la table d'appartenance de la colonne située à l'indice i.
Hors cette fonction renvoie (dans le cas de psotgresql) une chaîne vide "".

Le contexte dans lequel j'utilise cela, c'est avec deux tables qui ont une colonne qui porte le même nom. Dans un cas c'est la clef primaire de la table, dans l'autre cas c'est la clef étrangère de la table.
Ce à quoi cela va me servir, c'est de savoir si la colonne que je suis en train de traiter avec mon ResultSetMetaData, c'est de savoir si elle provient de la table où elle est clef étrangère, ou de la table où elle est clef primaire.

Code :
1
2
3
4
5
6
7
exemple  :
T1 (ma_colonne PKEY)
T2 (ma_colonne FKEY)
 
requête1 = SELECT ma_colonne FROM T1;
requête2 = SELECT ma_colonne FROM T2;
requête2 = SELECT T1.ma_colonne,T2.ma_colonne FROM T1, T2;
si je lance chacune des requêtes, il faut que j'arrive à trouver dans quelle requête c'est une clef primaire et dans laquelle c'est un clef étrangère. Mais pour cela il me faut le nom de la colonne et le nom de la table, sans avoir à parser la requête SQL. Car là les requêtes sont "bateau" mais si j'ai des requêtes imbriquées de partout, ça devient l'enfer. Et puis c'est surtout que je préfère éviter de coder un parseur si je peux récupérer cela avec les métadonnées.

Pour info, j'ai déjà le script SQL qui me permet avec le nom d'une colonne et le nom d'une table de savoir si c'est une clef primaire ou étrangère avec les tables systèmes.

Dans tous les cas, la fonction getTableName() renverra toujours une chaîne vide. Donc je ne sais pas comment faire ...

merci d'avance pour d'autres retours
nozostan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 18h52   #4
Invité régulier
 
Inscription : février 2007
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 28
Points : 7
Points : 7
personne n'a jamis essayé une telle chose ?
nozostan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h43.


 
 
 
 
Partenaires

Hébergement Web