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

Langage SQL Discussion :

[SQL SERVER] SELECT IMBRIQUE -> Mettre une instruction.


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut [SQL SERVER] SELECT IMBRIQUE -> Mettre une instruction.
    Bonjour à tous,

    J'ai 2 tables, une pointe vers l'autre;
    [T1id, T1T2id, T1lib]
    [T2id, T2lib]

    - T1T2id peut être null
    - Entre les 2, il y a une contrainte FK

    Je voudrais faire un batch d'INSERT pour T1, ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT T1 (T1T2id, T1lib) SELECT (SELECT TOP 1 T2id FROM T2 WHERE T2lib='Le lib T2'), ('Mon lib')
    Ça fonctionne bien, sauf quand il n'y a pas d'éléments trouvés dans T2 correspondant au Where.

    Comment faire, dans un select imbriqué, pour que ça renvoie NULL si le résultat ne convient pas ?

    J'ai essayé plein de trucs du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(
    (INSERT T1 (T1T2id, T1lib) SELECT (SELECT TOP 1 T2id FROM T2 WHERE T2lib='Le lib T2'), ('Mon lib') 
    UNION 
    (SELECT NULL)
    )
    Mais ça ne donne rien.

    J'ai aussi vu qu'il y avait un truc "NULLIF", que j'aurais aimé assayer pour voir si ça allait, mais je n'arrive pas à l'utiliser

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous trouverez quelques informations intéressantes dans ce sujet :
    http://www.developpez.net/forums/d72...imple-requete/

    N'hésitez pas à poster un petit jeu d'essai si vous voulez une réponse la plus précise qui soit.

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Waldar,

    Merci pour la rapidité, seulement, je ne vois pas ce qui peux correspondre à mon cas dans ce post.

    Voici un jeu d'exemple concret.
    La table 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GO
    CREATE TABLE Documents](
    [DocumentID] [int] NOT NULL,
    [FileId] [int] NULL)
     
    CONSTRAINT [PK_TreeView_Document] PRIMARY KEY CLUSTERED ([DocumentID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]
     
    ALTER TABLE Documents]  WITH CHECK ADD  CONSTRAINT [FK_TreeView_Document_Files] FOREIGN KEY([FileId]) REFERENCES [Files] ([FileId])
    END
    La requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT [Documents] (DocID, FileId) SELECT (387), (SELECT TOP 1 FileID FROM Files WHERE filename='LeLib')
    Et l'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY 'FK_TreeView_Document_Files'.
    Ca plante car l'élement n'a pas forcement été trouvé dans la table 2.
    Il faudrait intercepter ce cas pour mettre NULL à la place de... Je ne sais pas quoi, en fait...

  4. #4
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    et ma solution ?

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Juvamine,

    Je regarde... Mais je pense qu'il me faudrait plutôt un left join, nan ?

  6. #6
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    non, tu veux quoiqu'il arrive afficher une ligne...ce sera un right.

  7. #7
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    dommage je n'ai pas de quoi tester, mais sqlserver serait bien en mesure de faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT T1
           (
                  T1T2id,
                  T1lib
           )
    SELECT TOP 1 T2id,
           'Mon lib'
    FROM   T2
           RIGHT JOIN
                  (SELECT 'toto'
                  )
           WHERE  T2lib='Le lib T2'
    A+

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

Discussions similaires

  1. ASP/ SQL Server : resultat de RS dans une cellule.
    Par joe_le_mort dans le forum ASP
    Réponses: 2
    Dernier message: 11/08/2005, 14h26
  2. [SQL Server 2000] configurer ou supprimer une connexion
    Par drinkmilk dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/08/2005, 22h48
  3. [SQL Server]Recupération du résultat d'une procédure stockée
    Par navis84 dans le forum Bases de données
    Réponses: 8
    Dernier message: 04/04/2005, 21h53
  4. [SQL Server] Limiter le resultat d'une requête
    Par obiwan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/06/2004, 12h25

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