Bonjour,
savez vous comment avec des instructions SQL je pourrais déterminer avec un count les champs qui constitue la clé d'une table sachant que sur cette table aucune PK n'a été définie ?
Merci d'avance
Mederik
Version imprimable
Bonjour,
savez vous comment avec des instructions SQL je pourrais déterminer avec un count les champs qui constitue la clé d'une table sachant que sur cette table aucune PK n'a été définie ?
Merci d'avance
Mederik
C'est pas possible avec un count (??) puisque ça ramène un entier ! :aie:
sinon pour trouver la clef primaire, regarde ceci :
Code:
1
2
3
4
5
6 SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner FROM all_constraints cons, all_cons_columns cols WHERE cons.constraint_type = 'P' AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner ORDER BY cols.table_name, cols.position;
Arf j'ai souvenir d'avoir ete confronté une fois a ce probleme il y a longtemps et j'avais trouve un SQL avec des count, des sous-requetes si ces souvenir sont bons et en comparant le resultat avec le count(*) de la table.
Mais je suis tres rouillé en SQL, j'ai predu les reflexes et c'etait il y a longtemps et je ne me souviens plus de la logique. Mais je sais que c'est possible ;-)
Et ma requête ne te satisfait pas puisqu'elle retourne les clefs primaires des tables ? C'était bien ça ton besoin ??
Je pense que mederik n'a pas définit de clé primaire (le langage SQL le permet...) et veux la deviner.
L'idée c'est de comparer le nombre de lignes de la table avec le nombre de valeur distinctes dans chaque colonnes.
Exemple avec MySQL:
Code:
1
2
3
4
5
6
7
8
9
10
11
12 create table t ( a integer, b integer, c integer, d integer ); insert into t values (1, 2, NULL, 2), (2, 3, NULL, 4), (4, 6, 1, NULL), (9, 6, NULL, 1);
Code:
1
2
3
4
5
6 SELECT (SELECT Count(*) FROM t) AS nbLignes, (SELECT Count(DISTINCT a) FROM t) AS nbColA, (SELECT Count(DISTINCT b) FROM t) AS nbColB, (SELECT Count(DISTINCT c) FROM t) AS nbColC, (SELECT Count(DISTINCT d) FROM t) AS nbColD;
Ici, la colonne "a" garanti la propriété d'unicité d'une clé primaire.Code:
1
2
3 nbLignes nbColA nbColB nbColC nbColD 4 4 3 1 3
Mais cela reste du bricolage, il faut définir la clé primaire en amont.
PS: Je pense que pour Oracle il suffit d'ajouter un: "FROM dual;"
Oui c'est ça; a la différence que ce n'est pas moi qui ait créé cette table :lol:
En effet je cherchais donc à la deviner. Ton script, d'apres mes souvenirs de ce que j'avais fait est encore plus simple que ce que moi j'avais trouvé...
En tous cas merci à vous deux pour vos réponses
Bon WE ou bonne semaine, au choix ;)
Mederik
La clée primaire peut être composer de plusieurs champs, donc, essayez de combiner les colonnes et comparer leur count.
Exemple:
comparez nbrelig avec nbrelig1, nbrelig2,...pour détecter la clée primaireCode:
1
2
3
4
5
6
7
8
9
10
11 select count(*) as nbrelig from matable; select count(*) as nbrelig1 from (select distinct col1, col2 from matable); select count(*) as nbrelig2 from (select distinct col1, col3 from matable); select count(*) as nbrelig3 from (select distinct col2, col3 from matable); select count(*) as nbrelig3 from (select distinct col1, col2,col3 from matable); .......................................................................