Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 10/01/2011, 13h57   #1
Membre à l'essai
 
Inscription : août 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 54
Points : 20
Points : 20
Par défaut Requête select SQL

Bonjour,

À partir d'une info1, chercher dans table2 la colonne à rechercher dans la table 1.
À partir d'une info2, chercher dans la table1 les enregistrements dont la colonne trouvée ci-dessus a la valeur d'info2.

Exemple :
Code :
1
2
3
SELECT *
  FROM TABLE1 
 WHERE (SELECT t2.CHAMP2 FROM TABLE2 WHERE t2.CHAMP1 = 'titi') = 'toto'
Avec les données suivantes :
Code :
1
2
3
4
5
6
7
8
9
table1
t1.colonne1   t1.colonne2    t1.colonne3
     12345          toto           tata
       789           xxx           toto
 
table2
t2.champ1          t2.champ2
    titi         t1.colonne2
    tete         t1.colonne3
lonycc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h06   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

votre exemple n'est pas très concret (toto, titi, table1 champ1,...)
mais je pense que vous avez un gros problème de modélisation dans votre base de données.

Que représentent ces informations, et pourquoi voulez vous faire cela ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h48   #3
Membre à l'essai
 
Inscription : août 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 54
Points : 20
Points : 20
en fait la requête qui m'intéresse c'est celle-là !
un select dynamique dont je n aurais que le nom de la table et la valeur de la clé
(le nom de champ de la clé n'étant pour chacune des tables concernées pas le même )

Code :
1
2
3
4
5
6
7
 
SELECT * FROM " + NOMTABLE + "   
WHERE
(
SELECT top 1 syscolumns.name FROM sysobjects , syscolumns 
WHERE( sysobjects.id = syscolumns.id) AND (sysobjects.xtype = 'U') AND sysobjects.name LIKE NOMTABLE  ORDER BY syscolumns.colorder
)  = '" INFO2 "'"
lonycc est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/01/2011, 14h59   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

J'avais compris le principe, mais je vous demande pourquoi vous voulez faire ceci pour deux raisons :

1/ comme je le disais, votre base me semble très mal conçue. Je ne sais pas a quel stade vous en êtes au niveau du développement, et si vous avez la possibilité de faire ce qui s'impose sur le dit serveur de base de données, mais si c'est le cas, je vous invite a reconsidérer les choses et à revoir votre modèle.

2/ vos tables vont-elles être amenées à évoluer, ou est-ce que les colonnes sur lesquelles doivent s'appliquer les filtre sont déjà définies de façon exhaustive

C'est pour ca aussi que savoir de quoi on parle un peu plus précisément peu aider a vous orienter vers une solution plus adéquate.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 16h04   #5
Membre à l'essai
 
Inscription : août 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 54
Points : 20
Points : 20
Un gros problème de modélisation je pense aussi mais bon ce n'ai pas moi qui m'occupe de ça je n'ai donc pas la possibilité de le refaire correctement mais j'aurai aimé ne serais-ce que voir le modèle correct !!

Les tables seront certainement amenées à évoluer puisqu'ici tout se fait au fur et à mesure !

Pour mon cas je lis un .csv et pour chacune de ces ligne je verifier si il y a des enregistrement dans la table (le non de la table je le sais car c le nom du csv)
et la cle est le premier element de la ligne du csv
lonycc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 16h54   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Ce que vous voulez faire n'est pas possible tel que vous voulez le faire.

Vous avez deux possibilités
1/ la plus propre (ou plutot la moins sale) consiste à effectuer une jointure dépendant du contenu de votre colonne :

Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT *
FROM Table1 t1
INNER JOIN Table2 t2 
  ON t2.champ1 = 'titi' 
  AND 'toto' = CASE 
    WHEN t2.champ2 = 't1.colonne2' THEN t1.colonne2 
    WHEN  t2.champ2 = 't1.colonne3' THEN t1.colonne3
  END

Le problème, c'est que vous devrez modifier cette requete a chaque ajout de colonne dans la table1, ce qui risque d'arriver régulièrement vu comme c'est parti. D'un autre coté, quand on est prêt a changer son modèle de données régulièrement, il faut être prêt a changer ses requêtes aussi régulièrement !

2/ l'alternative consiste a créer votre requete dynamiquement a l'aide d'une autre requete, puis a l'exécuter. Mais cette solution a aussi son lot de risques et de complications (privilèges nécessaires, injections SQL, contexte d'exécution différent, ...).
Celle solution peut toutefois faire l'affaire si par exemple vous effectuez l'opération depuis un programme externe :
1/ requete pour récupérer la colonne sur laquelle filtrer
2/ un autre requete (générée dans votre programme à partir du résultat de la première) avec le bon filtre
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 08h09   #7
Membre à l'essai
 
Inscription : août 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 54
Points : 20
Points : 20
ok tant pis

je ferais ma requete en 2 fois

merci
lonycc 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 18h51.


 
 
 
 
Partenaires

Hébergement Web