IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

sous requête avec clause contrainte


Sujet :

Développement SQL Server

  1. #1
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    continent int check (continent in(select idcontinent from tcontinent))
    ... mais j'ai le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ... 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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Merci pour la réponse. Je crois comprendre pourquoi access avait du mal évaluer une contrainte du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/07/2011, 11h29
  2. Problème dans requête avec clause MAX
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2007, 17h00
  3. Sous-requêtes avec IN et NOT IN
    Par angebe dans le forum SQL
    Réponses: 6
    Dernier message: 28/09/2007, 11h59
  4. sous requête avec liste
    Par illegalsene dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/05/2007, 12h11
  5. Requête et sous requête avec SELECT et UPDATE
    Par Véronique75ca dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo