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 24/11/2010, 14h15   #1
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 538
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 538
Points : 603
Points : 603
Envoyer un message via Yahoo à alassanediakite
Par défaut sous requête avec clause contrainte

Salut
J'ai une table continents(id, nom) et je veux créer une table payes(continent, id, nom) avec la contrainte que les données du champ payes.continent soit dans la table continents (je ne veux pas me limiter à "foreign key"!!!).
J'ai fait ça (lors de la création de la table payes)...
Code :
continent int CHECK (continent IN(SELECT idcontinent FROM tcontinent))
... mais j'ai le message
Code :
Les sous-requêtes ne sont pas autorisées dans ce contexte. Seules sont permises les expressions scalaires.
... alors j'aimerais savoir comment faire pour qu'un champ chp1 d'une table T1 prennent ses valeurs obligatoirement dans le champ chp2 d'une table T2? sans passer par la clé étrangère.
Merci d'avance.
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h58   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 935
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 935
Points : 17 743
Points : 17 743
1) pour des raisons de performances, SQL Server n'accepte pas de contraintes de table dont les données sont externe à la table.
2) vous pouvez cependant contourner ce problème en mettant une UDF qui fera la même chose.

Exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION dbo.F_CHECH_CONTINENT (@idcontinent  INT)
RETURNS BIT
AS
BEGIN
    RETURN CASE 
              WHEN EXISTS(SELECT * 
                          FROM   dbo.tcontinent 
                          WHERE  idcontinent =@idcontinent ) 
                 THEN 1
              ELSE 0 
          END
END;
Ensuite :

Code :
... continent int CHECK (dbo.F_CHECH_CONTINENT (idcontinent) = 1)
Cependant, pour les mêmes raison de performances, la solution de la contrainte de clef étrangère FOREIGN KEY sera toujours incommensurablement plus rapide

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h21   #3
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 538
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 538
Points : 603
Points : 603
Envoyer un message via Yahoo à alassanediakite
Salut
Merci pour la réponse. Je crois comprendre pourquoi access avait du mal évaluer une contrainte du genre
Code :
(2>ALL(SELECT count(ideleve) FROM ligneclasse GROUP BY idannee))
je la voulais pour limiter l'inscription d'un élève dans une seule classe pour une année donnée.
Au fait vous avez attendu juste que j'achète la 2ème édition de SLQ pour faire sortir la 3ème. En tout cas, j'ai pas dit mon dernier mot. Et un livre uniquement sur TSQL pourquoi pas? La documentation en ligne est un océan de liens, et les débutants (comme moi) ont du mal à maitriser concept par concept. Par exemple cela me fait quatre (04) jours que j'essaye de maitriser les contours de "sauvegarde et restauration". Peut-être que je ferais un article sur ça dans avant la version 2008 ne soit obsolète.
Encore une fois
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h08.


 
 
 
 
Partenaires

Hébergement Web