3 votes

SQL : trouver la clause qui fait que ma requête ne retourne aucune réponse

Ma requête est basique et ressemble à ceci :

SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' AND CRIT3='c'

Cependant, il arrive qu'il ne renvoie aucune valeur. C'est normal car il n'y a pas de correspondance dans la table.

Pour aider mes utilisateurs à trouver quel critère est trop restrictif, je voudrais trouver une autre requête qui me dise si c'est à cause de la clause CRIT1, CRIT2 ou CRIT3 que je n'ai pas de réponse.

Actuellement, j'ai procédé de la manière suivante (en utilisant un pseudo-code) :

If ( SELECT ID FROM Table WHERE CRIT1='a'  returns EOF ) 

   Then WrongCriteria="CRIT1" 

Elseif ( SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' returns EOF )

    Then WrongCriteria="CRIT2"

Elseif ( SELECT ID FROM Table WHERE CRIT1='a' AND CRIT2='b' AND CRIT3='c'  returns EOF ) 

  Then WrongCriteria="CRIT3"

Cela fonctionne ... mais il y a plusieurs requêtes et chacune d'entre elles est très lente en raison du faible temps de réponse du réseau.

Ma question est la suivante : Est-il possible de réaliser le pseudo-code ci-dessus en une seule requête SQL ?

3voto

dasblinkenlight Points 264350

Vous pouvez combiner trois requêtes en une seule en utilisant SUM sur un conditionnel :

SELECT
    SUM(CASE WHEN CRIT1='a' THEN 1 ELSE 0 END) as CRIT1
,   SUM(CASE WHEN CRIT1='a' AND CRIT2='b' THEN 1 ELSE 0 END) as CRIT2
,   SUM(CASE WHEN CRIT1='a' AND CRIT2='b' AND CRIT3='c' THEN 1 ELSE 0 END) as CRIT3
FROM MyTable

Un zéro dans une colonne correspond à un critère trop restrictif.

Notez qu'il s'agit seulement d'une mise en œuvre différente de vos trois requêtes, qui "hiérarchise" les critères d'une manière spécifique (crit1 puis crit2 puis crit3). En théorie, avec trois critères, vous voulez tester tous les critères individuels, plus trois combinaisons de paires, c'est-à-dire obtenir six comptes pour ces conditions :

  • CRIT1='a'
  • CRIT2='b'
  • CRIT3='c'
  • CRIT1='a' && CRIT2='b'
  • CRIT1='a' && CRIT3='c'
  • CRIT2='b' && CRIT3='c'

Les six comptages ci-dessus vous donneront une image complète des critères trop restrictifs.

2voto

Niranjan Rajawat Points 445

Oui, il est possible de faire cette vérification dans une seule requête en utilisant ' OU opérateur. Je suppose qu'il n'y a qu'une seule condition qui peut être fausse à la fois :

SELECT CASE WHEN CRIT1 <> 'a' THEN 'CRIT1'
            WHEN CRIT2 <> 'b' THEN 'CRIT2'
            WHEN CRIT3 <> 'c' THEN 'CRIT3' END AS WrongCriteria
FROM Table WHERE CRIT1<>'a' OR CRIT2<>'b' OR CRIT3<>'c'

1voto

Alex Points 2803

Pour montrer toutes les combinaisons de restrictions :

SELECT 
        COALESCE( 'Conditions:'
            + NULLIF(
                    ( CASE WHEN CRIT1 <> 'a' THEN ' CRIT1' ELSE '' END )
                    + ( CASE WHEN CRIT2 <> 'b' THEN ' CRIT2' ELSE '' END )
                    + ( CASE WHEN CRIT3 <> 'c' THEN ' CRIT3' ELSE '' END ),
                '' ),
            'None' ) AS Restrictions
FROM MyTable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X