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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    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 confirmé 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
    Points : 502
    Points
    502
    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+

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    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...

  5. #5
    Membre confirmé 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
    Points : 502
    Points
    502
    Par défaut
    et ma solution ?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour Juvamine,

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

  7. #7
    Membre confirmé 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
    Points : 502
    Points
    502
    Par défaut
    non, tu veux quoiqu'il arrive afficher une ligne...ce sera un right.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    En fait, ca ne fonctionne pas... Mais je crains de ne pas m'avoir bien approprié ta methode.

    Voici la requete avec tous es champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT [Documents] (ModuleID, FileId, DocumentDisplayName, DocumentDescription, DocumentKeyWords, DocumentCreatedDate, DocumentCreatedByUser, DocumentUpdatedDate, DocumentUpdatedByUser, DocumentBuildDate, DocumentLastModifDate, DocumentDate) 
    SELECT (387), TOP 1 FileID, ('R110-1 à R110-3'), ('R110-1 à R110-3'), ('R110-1 à R110-3'), ('30/11/1999 00:00:00'), (1), ('13/12/2004 18:07:32'), (1), ('30/11/1999 00:00:00'), ('13/12/2004 18:07:32'), ('30/11/1999 00:00:00')
    RIGHT JOIN Files WHERE filename='code10.doc')

  9. #9
    Membre confirmé 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
    Points : 502
    Points
    502
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    INSERT [Documents]
           (
                  ModuleID             ,
                  FileId               ,
                  DocumentDisplayName  ,
                  DocumentDescription  ,
                  DocumentKeyWords     ,
                  DocumentCreatedDate  ,
                  DocumentCreatedByUser,
                  DocumentUpdatedDate  ,
                  DocumentUpdatedByUser,
                  DocumentBuildDate    ,
                  DocumentLastModifDate,
                  DocumentDate
           )
    SELECT (387)                  ,
           TOP 1 FileID           ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('30/11/1999 00:00:00'),
           (1)                    ,
           ('13/12/2004 18:07:32'),
           (1)                    ,
           ('30/11/1999 00:00:00'),
           ('13/12/2004 18:07:32'),
           ('30/11/1999 00:00:00')
           RIGHT JOIN
                  (SELECT 'toto'
                  )
           WHERE  filename='code10.doc')
    essaie ça, ma RIGHT jointure (SELECT 'toto') sert juste à "afficher une ligne au moins" Même si l'autre renvoie NULL. Je ne suis pas sur que ça fonctionne, et je n'ai pas de moyen de tester

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    J'ai déplacé le top car il disait qu'il ne passait pas là ou il était.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    INSERT [Documents]       (
                  ModuleID             ,
                  FileId               ,
                  DocumentDisplayName  ,
                  DocumentDescription  ,
                  DocumentKeyWords     ,
                  DocumentCreatedDate  ,
                  DocumentCreatedByUser,
                  DocumentUpdatedDate  ,
                  DocumentUpdatedByUser,
                  DocumentBuildDate    ,
                  DocumentLastModifDate,
                  DocumentDate
           )
    SELECT TOP 1 (387)                  ,
           FileID           ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('30/11/1999 00:00:00'),
           (1)                    ,
           ('13/12/2004 18:07:32'),
           (1)                    ,
           ('30/11/1999 00:00:00'),
           ('13/12/2004 18:07:32'),
           ('30/11/1999 00:00:00')
           RIGHT JOIN
                  (SELECT 'toto')
           WHERE  filename='code10.doc')
    Du coup, l'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers le mot clé 'RIGHT'. Syntaxe incorrecte vers le mot clé 'WHERE'.

  11. #11
    Membre confirmé 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
    Points : 502
    Points
    502
    Par défaut
    en effet
    y'a pas de FROM :awe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    INSERT [Documents]
           (
                  ModuleID             ,
                  FileId               ,
                  DocumentDisplayName  ,
                  DocumentDescription  ,
                  DocumentKeyWords     ,
                  DocumentCreatedDate  ,
                  DocumentCreatedByUser,
                  DocumentUpdatedDate  ,
                  DocumentUpdatedByUser,
                  DocumentBuildDate    ,
                  DocumentLastModifDate,
                  DocumentDate
           )
    SELECT (387)                  ,
           TOP 1 FileID           ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('R110-1 à R110-3')    ,
           ('30/11/1999 00:00:00'),
           (1)                    ,
           ('13/12/2004 18:07:32'),
           (1)                    ,
           ('30/11/1999 00:00:00'),
           ('13/12/2004 18:07:32'),
           ('30/11/1999 00:00:00')
    FROM   Files
           RIGHT JOIN
                  (SELECT 'toto'
                  )
           WHERE  filename='code10.doc'

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Nan, rien à faire...

    Il gueulait toujours sur le TOP, donc je l'ai redéplacé.
    Et maintenant: Syntaxe incorrecte vers le mot clé 'WHERE'
    (le right a disparu par contre...)

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    INCROYABLE !

    Sans le (SELECT 'toto'), ça fonctionne à merveille.
    Il doit interpréter le retour différemment si c'est une jointure.

    Merci beaucoup à vous 2 pour votre participation !

    Merci une fois de plus, developpez.com.

  14. #14
    Membre confirmé 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
    Points : 502
    Points
    502
    Par défaut
    tu en est où avec ta requete ?

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Le right join en plus d'être inutile fonctionnellement est faux techniquement vu qu'il n'y a pas de prédicat de jointure (qui est obligatoire).

    Evitez les parenthèses lorsque c'est inutile, ça ne facilite pas la relecture.
    L'ordre propre d'insertion est INSERT INTO <table>.

    Utilisez un bon typage : nombre pour des nombres, chaîne pour des chaînes et date pour des dates.
    Actuellement vous avez des chaînes pour des datetimes et des nombres pour des chaînes.

    En compilant un peu tout ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    INSERT INTO Documents
    (
        ModuleID             ,
        FileId               ,
        DocumentDisplayName  ,
        DocumentDescription  ,
        DocumentKeyWords     ,
        DocumentCreatedDate  ,
        DocumentCreatedByUser,
        DocumentUpdatedDate  ,
        DocumentUpdatedByUser,
        DocumentBuildDate    ,
        DocumentLastModifDate,
        DocumentDate
    )
    SELECT
        387                                    ,
        FileID                                 ,
        'R110-1 à R110-3'                      ,
        'R110-1 à R110-3'                      ,
        'R110-1 à R110-3'                      ,
        cast('30/11/1999 00:00:00' as datetime),
        'USER_CREATE'                          ,
        cast('13/12/2004 18:07:32' as datetime),
        'USER_UPDATE'                          ,
        cast('30/11/1999 00:00:00' as datetime),
        cast('13/12/2004 18:07:32' as datetime),
        cast('30/11/1999 00:00:00' as datetime)
    FROM   Files
    WHERE  filename = 'code10.doc'

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Aie... En fait, je viens de voir.

    Mais si le SELECT ne trouve pas son fichier, aucun champ n'est renvoyé !
    Du coup, l'insertion ne s'est pas faite !!!

    Je ne l'ai pas vu car mon script contient plus de 1000 insertions... Mais je veux que chacune soit faite, même s'il n'y a rien dans table 2 !

    Bon, j'en ai assez ! Je vire cette contrainte FK de *%##?!* et on en parle plus.


    SQL SERVER M'A TUER !

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Alors peut-être avec le RIGHT JOIN correctement implémenté (le reste de la requête ne change pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM
        Files
        RIGHT JOIN (SELECT 'toto') as T
          ON filename = 'code10.doc'

+ 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