Utiliser plusieurs fois une sous-requête dans un filtre
6 réponses
halfwolf
Bonjour,
Dans la clause WHERE d'une requ=EAte SELECT, j'utilise une sous-requ=EAte
pour obtenir une valeur sur laquelle je dois faire un test.
Mon test n'est pas simple et n=E9cessite plusieurs AND et OR utilisants
=E0 chaque fois le r=E9sultat de ma sous-requ=EAte.
J'arrive =E0 obtenir le r=E9sultat que je veux en =E9crivant autant de
fois ma sous-requ=EAte que j'en ai besoin, mais cette fa=E7on de
proc=E9der ne me pla=EEt pas : je voudrais n'avoir =E0 modifier qu'un
endroit en cas de modification de cette sous-requ=EAte.
N'existe-t'il pas un moyen de nommer temporairement le r=E9sultat de ma
sous-requ=EAte et de n'utiliser que ce nom dans mon filtre ? Si non,
comment feriez vous ? Je travaille avec SQL server 2000.
J'ai essay=E9 en bidouillant avec AS mais =E7a ne fonctionne pas.
J'ai cherch=E9 (peut-=EAtre mal) sur le web, mais je n'arrive pas =E0
trouver de cas qui repr=E9sente mon probl=E8me.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Med Bouchenafa
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux dans une variable de type table?
-- Bien cordialement Med Bouchenafa a écrit dans le message de news:
Bonjour,
Dans la clause WHERE d'une requête SELECT, j'utilise une sous-requête pour obtenir une valeur sur laquelle je dois faire un test. Mon test n'est pas simple et nécessite plusieurs AND et OR utilisants à chaque fois le résultat de ma sous-requête. J'arrive à obtenir le résultat que je veux en écrivant autant de fois ma sous-requête que j'en ai besoin, mais cette façon de procéder ne me plaît pas : je voudrais n'avoir à modifier qu'un endroit en cas de modification de cette sous-requête. N'existe-t'il pas un moyen de nommer temporairement le résultat de ma sous-requête et de n'utiliser que ce nom dans mon filtre ? Si non, comment feriez vous ? Je travaille avec SQL server 2000.
J'ai essayé en bidouillant avec AS mais ça ne fonctionne pas. J'ai cherché (peut-être mal) sur le web, mais je n'arrive pas à trouver de cas qui représente mon problème.
Merci d'avance pour votre aide.
HalfWolf
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux dans
une variable de type table?
--
Bien cordialement
Med Bouchenafa
<halfwolf@free.fr> a écrit dans le message de news:
1153909559.051314.35310@h48g2000cwc.googlegroups.com...
Bonjour,
Dans la clause WHERE d'une requête SELECT, j'utilise une sous-requête
pour obtenir une valeur sur laquelle je dois faire un test.
Mon test n'est pas simple et nécessite plusieurs AND et OR utilisants
à chaque fois le résultat de ma sous-requête.
J'arrive à obtenir le résultat que je veux en écrivant autant de
fois ma sous-requête que j'en ai besoin, mais cette façon de
procéder ne me plaît pas : je voudrais n'avoir à modifier qu'un
endroit en cas de modification de cette sous-requête.
N'existe-t'il pas un moyen de nommer temporairement le résultat de ma
sous-requête et de n'utiliser que ce nom dans mon filtre ? Si non,
comment feriez vous ? Je travaille avec SQL server 2000.
J'ai essayé en bidouillant avec AS mais ça ne fonctionne pas.
J'ai cherché (peut-être mal) sur le web, mais je n'arrive pas à
trouver de cas qui représente mon problème.
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux dans une variable de type table?
-- Bien cordialement Med Bouchenafa a écrit dans le message de news:
Bonjour,
Dans la clause WHERE d'une requête SELECT, j'utilise une sous-requête pour obtenir une valeur sur laquelle je dois faire un test. Mon test n'est pas simple et nécessite plusieurs AND et OR utilisants à chaque fois le résultat de ma sous-requête. J'arrive à obtenir le résultat que je veux en écrivant autant de fois ma sous-requête que j'en ai besoin, mais cette façon de procéder ne me plaît pas : je voudrais n'avoir à modifier qu'un endroit en cas de modification de cette sous-requête. N'existe-t'il pas un moyen de nommer temporairement le résultat de ma sous-requête et de n'utiliser que ce nom dans mon filtre ? Si non, comment feriez vous ? Je travaille avec SQL server 2000.
J'ai essayé en bidouillant avec AS mais ça ne fonctionne pas. J'ai cherché (peut-être mal) sur le web, mais je n'arrive pas à trouver de cas qui représente mon problème.
Merci d'avance pour votre aide.
HalfWolf
halfwolf
Bonjour,
Med Bouchenafa wrote:
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux da ns une variable de type table?
En fait ma sous-requête est corrélée à la requête principale. Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale je ne veux que les résultats dont le nombre satisfait certains critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon cas) : J'ai une table salariés et une table ordinateurs. Chaque salarié pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table qui sert à faire le lien entre la table salariés et la table ordinateurs. Cependant pour chaque salarié est configuré un nombre min et un nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux récupérer tous les salariés qui n'ont pas assez ou qui ont trop d'ordinateurs. Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un exemple simplifié, ma condition réelle est plus compliquée et utilise plusieurs OR et AND. Je voudrais être capable de donner un surnom à ma sous-requête et d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas comment faire.
Bonjour,
Med Bouchenafa wrote:
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux da ns
une variable de type table?
En fait ma sous-requête est corrélée à la requête principale.
Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale
je ne veux que les résultats dont le nombre satisfait certains
critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon
cas) :
J'ai une table salariés et une table ordinateurs. Chaque salarié
pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table
qui sert à faire le lien entre la table salariés et la table
ordinateurs.
Cependant pour chaque salarié est configuré un nombre min et un
nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux
récupérer tous les salariés qui n'ont pas assez ou qui ont trop
d'ordinateurs.
Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un
exemple simplifié, ma condition réelle est plus compliquée et
utilise plusieurs OR et AND.
Je voudrais être capable de donner un surnom à ma sous-requête et
d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas
comment faire.
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux da ns une variable de type table?
En fait ma sous-requête est corrélée à la requête principale. Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale je ne veux que les résultats dont le nombre satisfait certains critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon cas) : J'ai une table salariés et une table ordinateurs. Chaque salarié pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table qui sert à faire le lien entre la table salariés et la table ordinateurs. Cependant pour chaque salarié est configuré un nombre min et un nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux récupérer tous les salariés qui n'ont pas assez ou qui ont trop d'ordinateurs. Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un exemple simplifié, ma condition réelle est plus compliquée et utilise plusieurs OR et AND. Je voudrais être capable de donner un surnom à ma sous-requête et d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas comment faire.
Patrice
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Sinon il dudra je pense détailler le problème...
-- Patrice
a écrit dans le message de news:
Bonjour,
Med Bouchenafa wrote:
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux dans une variable de type table?
En fait ma sous-requête est corrélée à la requête principale. Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale je ne veux que les résultats dont le nombre satisfait certains critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon cas) : J'ai une table salariés et une table ordinateurs. Chaque salarié pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table qui sert à faire le lien entre la table salariés et la table ordinateurs. Cependant pour chaque salarié est configuré un nombre min et un nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux récupérer tous les salariés qui n'ont pas assez ou qui ont trop d'ordinateurs. Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un exemple simplifié, ma condition réelle est plus compliquée et utilise plusieurs OR et AND. Je voudrais être capable de donner un surnom à ma sous-requête et d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas comment faire.
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s
JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié)
AS o ON o.Salarié=s.Salarié
WHERE o.Compte<s.Min OR o.Compte>s.Max
Sinon il dudra je pense détailler le problème...
--
Patrice
<halfwolf@free.fr> a écrit dans le message de news:
1153998570.153805.57830@b28g2000cwb.googlegroups.com...
Bonjour,
Med Bouchenafa wrote:
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux
dans
une variable de type table?
En fait ma sous-requête est corrélée à la requête principale.
Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale
je ne veux que les résultats dont le nombre satisfait certains
critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon
cas) :
J'ai une table salariés et une table ordinateurs. Chaque salarié
pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table
qui sert à faire le lien entre la table salariés et la table
ordinateurs.
Cependant pour chaque salarié est configuré un nombre min et un
nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux
récupérer tous les salariés qui n'ont pas assez ou qui ont trop
d'ordinateurs.
Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un
exemple simplifié, ma condition réelle est plus compliquée et
utilise plusieurs OR et AND.
Je voudrais être capable de donner un surnom à ma sous-requête et
d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas
comment faire.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Sinon il dudra je pense détailler le problème...
-- Patrice
a écrit dans le message de news:
Bonjour,
Med Bouchenafa wrote:
Pourquoi ne pas envoyer le resultat dans une table temporaire ou mieux dans une variable de type table?
En fait ma sous-requête est corrélée à la requête principale. Il s'agit d'un SELECT COUNT(*) FROM ... et dans ma requête principale je ne veux que les résultats dont le nombre satisfait certains critères.
Pour prendre un exemple (qui illustre mais ne correspond pas à mon cas) : J'ai une table salariés et une table ordinateurs. Chaque salarié pourrait avoir 0, 1 ou plusieurs ordinateurs. J'ai donc aussi une table qui sert à faire le lien entre la table salariés et la table ordinateurs. Cependant pour chaque salarié est configuré un nombre min et un nombre max d'ordinateurs qu'il a le droit d'avoir, et je veux récupérer tous les salariés qui n'ont pas assez ou qui ont trop d'ordinateurs. Je sais qu'avec (NOT) BETWEEN, on s'en sort, mais là c'est juste un exemple simplifié, ma condition réelle est plus compliquée et utilise plusieurs OR et AND. Je voudrais être capable de donner un surnom à ma sous-requête et d'utiliser ce surnom dans ma requête principale, mais je ne trouve pas comment faire.
halfwolf
Bonjour,
Patrice wrote:
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salar ié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est associé à un salarié alors que le Min du Salarié est à 1, on ne le détecte pas. J'ai adapté votre requête et obtenu quelque chose comme ceci :
SELECT * FROM Salarié AS s1 INNER JOIN ( SELECT s2.Salarié, CASE WHEN o.Salarié IS NULL THEN 0 ELSE COUNT(*) END AS Compte FROM Salariés AS s2 LEFT JOIN Ordinateurs AS o ON o.Salarié=s2.Salarié GROUP BY s2.Salarié, o.Salarié) AS sc ON s1.Salarié = s2.Salarié WHERE sc.Compte < s1.Min OR sc.Compte > s1.Max
Qu'en pensez vous ?
Bonjour,
Patrice wrote:
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s
JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salar ié)
AS o ON o.Salarié=s.Salarié
WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est
associé à un salarié alors que le Min du Salarié est à 1, on ne le
détecte pas. J'ai adapté votre requête et obtenu quelque chose comme
ceci :
SELECT *
FROM
Salarié AS s1
INNER JOIN
( SELECT
s2.Salarié,
CASE
WHEN o.Salarié IS NULL THEN 0
ELSE COUNT(*)
END AS Compte
FROM
Salariés AS s2
LEFT JOIN Ordinateurs AS o
ON o.Salarié=s2.Salarié
GROUP BY s2.Salarié, o.Salarié) AS sc
ON s1.Salarié = s2.Salarié
WHERE
sc.Compte < s1.Min OR sc.Compte > s1.Max
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salar ié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est associé à un salarié alors que le Min du Salarié est à 1, on ne le détecte pas. J'ai adapté votre requête et obtenu quelque chose comme ceci :
SELECT * FROM Salarié AS s1 INNER JOIN ( SELECT s2.Salarié, CASE WHEN o.Salarié IS NULL THEN 0 ELSE COUNT(*) END AS Compte FROM Salariés AS s2 LEFT JOIN Ordinateurs AS o ON o.Salarié=s2.Salarié GROUP BY s2.Salarié, o.Salarié) AS sc ON s1.Salarié = s2.Salarié WHERE sc.Compte < s1.Min OR sc.Compte > s1.Max
Qu'en pensez vous ?
Patrice
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se transposer dans votre cas. Si non, il faut détailler (un exemple simplifié est pratique mais cela peut aussi masquer parfois le problème ou d'autres problèmes levés par la situation réelle).
-- Patrice
a écrit dans le message de news:
Bonjour,
Patrice wrote:
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est associé à un salarié alors que le Min du Salarié est à 1, on ne le détecte pas. J'ai adapté votre requête et obtenu quelque chose comme ceci :
SELECT * FROM Salarié AS s1 INNER JOIN ( SELECT s2.Salarié, CASE WHEN o.Salarié IS NULL THEN 0 ELSE COUNT(*) END AS Compte FROM Salariés AS s2 LEFT JOIN Ordinateurs AS o ON o.Salarié=s2.Salarié GROUP BY s2.Salarié, o.Salarié) AS sc ON s1.Salarié = s2.Salarié WHERE sc.Compte < s1.Min OR sc.Compte > s1.Max
Qu'en pensez vous ?
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de
sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se
transposer dans votre cas. Si non, il faut détailler (un exemple simplifié
est pratique mais cela peut aussi masquer parfois le problème ou d'autres
problèmes levés par la situation réelle).
--
Patrice
<halfwolf@free.fr> a écrit dans le message de news:
1154009591.271231.84230@m73g2000cwd.googlegroups.com...
Bonjour,
Patrice wrote:
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s
JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié)
AS o ON o.Salarié=s.Salarié
WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est
associé à un salarié alors que le Min du Salarié est à 1, on ne le
détecte pas. J'ai adapté votre requête et obtenu quelque chose comme
ceci :
SELECT *
FROM
Salarié AS s1
INNER JOIN
( SELECT
s2.Salarié,
CASE
WHEN o.Salarié IS NULL THEN 0
ELSE COUNT(*)
END AS Compte
FROM
Salariés AS s2
LEFT JOIN Ordinateurs AS o
ON o.Salarié=s2.Salarié
GROUP BY s2.Salarié, o.Salarié) AS sc
ON s1.Salarié = s2.Salarié
WHERE
sc.Compte < s1.Min OR sc.Compte > s1.Max
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se transposer dans votre cas. Si non, il faut détailler (un exemple simplifié est pratique mais cela peut aussi masquer parfois le problème ou d'autres problèmes levés par la situation réelle).
-- Patrice
a écrit dans le message de news:
Bonjour,
Patrice wrote:
Avec AS.
Par exemple cela pourrait être quelque chose comme :
SELECT * FROM Salariés AS s JOIN (SELECT Salarié,COUNT(*) AS compte FROM Ordinateurs GROUP BY Salarié) AS o ON o.Salarié=s.Salarié WHERE o.Compte<s.Min OR o.Compte>s.Max
Merci, votre exemple m'a mis sur la voie.
Le problème de votre requête c'est que si aucun ordinateur n'est associé à un salarié alors que le Min du Salarié est à 1, on ne le détecte pas. J'ai adapté votre requête et obtenu quelque chose comme ceci :
SELECT * FROM Salarié AS s1 INNER JOIN ( SELECT s2.Salarié, CASE WHEN o.Salarié IS NULL THEN 0 ELSE COUNT(*) END AS Compte FROM Salariés AS s2 LEFT JOIN Ordinateurs AS o ON o.Salarié=s2.Salarié GROUP BY s2.Salarié, o.Salarié) AS sc ON s1.Salarié = s2.Salarié WHERE sc.Compte < s1.Min OR sc.Compte > s1.Max
Qu'en pensez vous ?
halfwolf
Patrice wrote:
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se transposer dans votre cas. Si non, il faut détailler (un exemple simpli fié est pratique mais cela peut aussi masquer parfois le problème ou d'autr es problèmes levés par la situation réelle).
Oui, ça a marché dans mon cas. Ce que j'ai posté est en fait la transposition de mon cas dans l'exemple cité.
Donc merci à tous deux pour votre aide et le temps que vous m'avez accordé.
Patrice wrote:
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de
sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se
transposer dans votre cas. Si non, il faut détailler (un exemple simpli fié
est pratique mais cela peut aussi masquer parfois le problème ou d'autr es
problèmes levés par la situation réelle).
Oui, ça a marché dans mon cas.
Ce que j'ai posté est en fait la transposition de mon cas dans
l'exemple cité.
Donc merci à tous deux pour votre aide et le temps que vous m'avez
accordé.
Sans doute ou peut-être un simple LEFT JOIN en adaptant le critère de sélection pour traiter les valeurs nulles...
Ce qui compte c'est surtout de voir le mécanisme de l'alias (AS) peut se transposer dans votre cas. Si non, il faut détailler (un exemple simpli fié est pratique mais cela peut aussi masquer parfois le problème ou d'autr es problèmes levés par la situation réelle).
Oui, ça a marché dans mon cas. Ce que j'ai posté est en fait la transposition de mon cas dans l'exemple cité.
Donc merci à tous deux pour votre aide et le temps que vous m'avez accordé.