Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sous Requete sur doublon

Sujet résolu
    15 novembre 2017 à 17:08:24

    Voilà mon souci:

    Pour simplifier j'aimerai faire une requête de ce genre et j'aimerai savoir si il y a un moyen:

    SELECT * FROM SUIVIHORAIRE 
    WHERE (couple DATE et UTILISATEUR) NOT IN 
    (
    Select DATE,UTILISATEUR FROM SUIVIHORAIRE WHERE ....
    )

    Sachant que je suis sous Windows Sql Server, je dois donc me limiter au SQL ou au TSQL.

    -
    Edité par MariusBelin 15 novembre 2017 à 17:26:54

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2017 à 17:28:04

      Bonjour,

      Peux-tu préciser un peu ... là c'est très flou ...

      Genre écrire une phrase en français : "Je veux la liste des suivihoraire dont le couple date/utilisateur n'est pas ..."

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        16 novembre 2017 à 9:45:57

        Merci de la réponse.

        D'accord je vais essayer de préciser. Alors j'ai un tableau de suivi d'horaires qui décrivent une action d'un utilisateur (qui peut être un début de poste, une fin de poste, un début de pause ou une fin de pause) à une heure et une date donnée.

        J'ai donc une table suivi horaire avec comme champs : une date, un utilisateur, une heure et une action (DEBUTPOSTE par exemple).

        Je voudrais la liste des suivis horaires pour laquelle l'action est soit une fin de poste soit une fin de pause et pour laquelle il n'y pas a eu de debut de poste ni de debut de pause le même jour avec le même utilisateur.

        J'espère avoir été clair, le problème n'est pas forcement évident.

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2017 à 10:14:53

          Avec une jointure externe tu peux dire "qui n'existe pas", je préfère cela à NOT EXISTS, cela fait des requêtes plus courtes :p

          Exemple :

          SELECT T1.*
          FROM
          	SUIVIHORAIRE T1
          		LEFT JOIN SUIVIHORAIRE T2
          			T1.UTILISATEUR = T2.UTILISATEUR
          			AND T1.DATE = T2.DATE
          			AND T2.ACTION = 'FINPOSTE'
          WHERE
          	T1.ACTION = 'DEBUTPOSTE'
          	AND T2.UTILISATEUR IS NULL

          Cette requête devrait te retourner les suivis ayant un DEBUTPOSTE mais pas de FINPOSTE pour un même utilisateur à une même date.

          Si tu veux mettre plusieurs actions différentes, le plus simple c'est l'UNION :

          SELECT T1.*
          FROM
          	SUIVIHORAIRE T1
          		LEFT JOIN SUIVIHORAIRE T2
          			T1.UTILISATEUR = T2.UTILISATEUR
          			AND T1.DATE = T2.DATE
          			AND T2.ACTION = 'FINPOSTE'
          WHERE
          	T1.ACTION = 'DEBUTPOSTE'
          	AND T2.UTILISATEUR IS NULL
          
          UNION
          
          SELECT T1.*
          FROM
          	SUIVIHORAIRE T1
          		LEFT JOIN SUIVIHORAIRE T2
          			T1.UTILISATEUR = T2.UTILISATEUR
          			AND T1.DATE = T2.DATE
          			AND T2.ACTION = 'FINPAUSE'
          WHERE
          	T1.ACTION = 'DEBUTPAUSE'
          	AND T2.UTILISATEUR IS NULL

          Sinon il faut bricoler les conditions de la jointure externe pour reprendre les cas possibles ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            16 novembre 2017 à 10:31:01

            Vraiment très fort merci ! 

            • Partager sur Facebook
            • Partager sur Twitter

            Sous Requete sur doublon

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown