OVH Cloud OVH Cloud

Pb proc stockée avec distinct

6 réponses
Avatar
Elo
Bonjour,

J'essaie de mettre en place une proc=E9dure stock=E9e, mais=20
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements =E0=20
renvoyer ainsi qu'un order by, mais Visual studio ne veut=20
pas me l'enregsitrer.

Voici ma proc=E9dure stock=E9e :=20

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER=20
BY items must appear in the select list if SELECT=20
DISTINCT is specified.

Quelqu'un a une id=E9e de ce qui ne va pas ?

Merci d'avance.

Elo

6 réponses

Avatar
Aba
Vu dans la documentation SQL :
"La clause ORDER BY peut comporter des éléments qui n'apparaissent pas dans
la liste de sélection. Toutefois, si SELECT DISTINCT est spécifié ou si
l'instruction SELECT contient un opérateur UNION, les colonnes de tri
doivent apparaître dans la liste de sélection."


SELECT DISTINCT id2, date_parution FROM table1 ORDER BY Date_parution
DESC -----> fonctionne
SELECT DISTINCT id2 FROM table1 ---> fonctionne



"Elo" a écrit dans le message de
news:2345a01c45e7f$7329e700$
Bonjour,

J'essaie de mettre en place une procédure stockée, mais
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements à
renvoyer ainsi qu'un order by, mais Visual studio ne veut
pas me l'enregsitrer.

Voici ma procédure stockée :

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER
BY items must appear in the select list if SELECT
DISTINCT is specified.

Quelqu'un a une idée de ce qui ne va pas ?

Merci d'avance.

Elo
Avatar
Elo
Merci pour les infos.
En fait, je crois que je vais devoir rajouter une sous
requete pasrce que je veux que mon distinct ne s'applique
que si le champs id

Elo

-----Message d'origine-----
Vu dans la documentation SQL :
"La clause ORDER BY peut comporter des éléments qui


n'apparaissent pas dans
la liste de sélection. Toutefois, si SELECT DISTINCT est


spécifié ou si
l'instruction SELECT contient un opérateur UNION, les


colonnes de tri
doivent apparaître dans la liste de sélection."


SELECT DISTINCT id2, date_parution FROM table1 ORDER BY


Date_parution
DESC -----> fonctionne
SELECT DISTINCT id2 FROM table1 ---> fonctionne



"Elo" a écrit dans


le message de
news:2345a01c45e7f$7329e700$
Bonjour,

J'essaie de mettre en place une procédure stockée, mais
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements à
renvoyer ainsi qu'un order by, mais Visual studio ne veut
pas me l'enregsitrer.

Voici ma procédure stockée :

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER
BY items must appear in the select list if SELECT
DISTINCT is specified.

Quelqu'un a une idée de ce qui ne va pas ?

Merci d'avance.

Elo


.



Avatar
Patrice
Dès que le DISTINCT nécessite d'autres champs, penser au GROUP BY. Par
exemple cela pourrait donner :

SELECT id2,MAX(Date_parution) FROM Table1 GROUP BY id2 ORDER BY 2

Le problème étant de savoir quelle est la valeur de Date_parution à prendre
en compte pour des valeurs identiques de id2...

Patrice

--

"Elo" a écrit dans le message de
news:2347d01c45e82$608784b0$
Merci pour les infos.
En fait, je crois que je vais devoir rajouter une sous
requete pasrce que je veux que mon distinct ne s'applique
que si le champs id

Elo

-----Message d'origine-----
Vu dans la documentation SQL :
"La clause ORDER BY peut comporter des éléments qui


n'apparaissent pas dans
la liste de sélection. Toutefois, si SELECT DISTINCT est


spécifié ou si
l'instruction SELECT contient un opérateur UNION, les


colonnes de tri
doivent apparaître dans la liste de sélection."


SELECT DISTINCT id2, date_parution FROM table1 ORDER BY


Date_parution
DESC -----> fonctionne
SELECT DISTINCT id2 FROM table1 ---> fonctionne



"Elo" a écrit dans


le message de
news:2345a01c45e7f$7329e700$
Bonjour,

J'essaie de mettre en place une procédure stockée, mais
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements à
renvoyer ainsi qu'un order by, mais Visual studio ne veut
pas me l'enregsitrer.

Voici ma procédure stockée :

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER
BY items must appear in the select list if SELECT
DISTINCT is specified.

Quelqu'un a une idée de ce qui ne va pas ?

Merci d'avance.

Elo


.



Avatar
Elo
Merci pour vos conseils.
Finalement après quelques recherche et un peu de
bidouille j'ai réussi à faire la requête que je voulais,
qui utilise un distict, un top, et le tout dépendant de
la date...

Au cas où qqn se retrouverait avec le même problème que
moi, je vous mets ma proc stockée :

SELECT TOP 3 id1
FROM table1
WHERE id1 IN(
SELECT DISTINCT id1
FROM table1
WHERE date_parution<getdate()
AND id1 IN (
SELECT id2
FROM table2
WHERE actif!=0
)
)
ORDER BY date_parution DESC

Elo.

-----Message d'origine-----
Dès que le DISTINCT nécessite d'autres champs, penser au


GROUP BY. Par
exemple cela pourrait donner :

SELECT id2,MAX(Date_parution) FROM Table1 GROUP BY id2


ORDER BY 2

Le problème étant de savoir quelle est la valeur de


Date_parution à prendre
en compte pour des valeurs identiques de id2...

Patrice

--

"Elo" a écrit dans


le message de
news:2347d01c45e82$608784b0$
Merci pour les infos.
En fait, je crois que je vais devoir rajouter une sous
requete pasrce que je veux que mon distinct ne s'applique
que si le champs id

Elo

-----Message d'origine-----
Vu dans la documentation SQL :
"La clause ORDER BY peut comporter des éléments qui


n'apparaissent pas dans
la liste de sélection. Toutefois, si SELECT DISTINCT est


spécifié ou si
l'instruction SELECT contient un opérateur UNION, les


colonnes de tri
doivent apparaître dans la liste de sélection."


SELECT DISTINCT id2, date_parution FROM table1 ORDER BY


Date_parution
DESC -----> fonctionne
SELECT DISTINCT id2 FROM table1 ---> fonctionne



"Elo" a écrit dans


le message de
news:2345a01c45e7f$7329e700$
Bonjour,

J'essaie de mettre en place une procédure stockée, mais
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements à
renvoyer ainsi qu'un order by, mais Visual studio ne




veut
pas me l'enregsitrer.

Voici ma procédure stockée :

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER
BY items must appear in the select list if SELECT
DISTINCT is specified.

Quelqu'un a une idée de ce qui ne va pas ?

Merci d'avance.

Elo


.





.



Avatar
Sylvain Lafontaine
En quoi la structure de votre requête est-elle supérieure à celle proposée
par Aba? Vous devriez relire attentivement son message et celui de Patrice
pour comprendre ce qui se passe vraiment.

De plus, non seulement l'utilisation de la clause DISTINCT en remplacement
d'un Group By m'apparaît suspecte dans votre cas mais l'utilisation de la
clause IN (en remplacement d'une clause JOIN entre les tables 1 et 2 par
exemple) l'est tout autant à mes yeux.

S. L.

"Elo" wrote in message
news:239d801c45ea5$edca9d30$
Merci pour vos conseils.
Finalement après quelques recherche et un peu de
bidouille j'ai réussi à faire la requête que je voulais,
qui utilise un distict, un top, et le tout dépendant de
la date...

Au cas où qqn se retrouverait avec le même problème que
moi, je vous mets ma proc stockée :

SELECT TOP 3 id1
FROM table1
WHERE id1 IN(
SELECT DISTINCT id1
FROM table1
WHERE date_parution<getdate()
AND id1 IN (
SELECT id2
FROM table2
WHERE actif!=0
)
)
ORDER BY date_parution DESC

Elo.

-----Message d'origine-----
Dès que le DISTINCT nécessite d'autres champs, penser au


GROUP BY. Par
exemple cela pourrait donner :

SELECT id2,MAX(Date_parution) FROM Table1 GROUP BY id2


ORDER BY 2

Le problème étant de savoir quelle est la valeur de


Date_parution à prendre
en compte pour des valeurs identiques de id2...

Patrice

--

"Elo" a écrit dans


le message de
news:2347d01c45e82$608784b0$
Merci pour les infos.
En fait, je crois que je vais devoir rajouter une sous
requete pasrce que je veux que mon distinct ne s'applique
que si le champs id

Elo

-----Message d'origine-----
Vu dans la documentation SQL :
"La clause ORDER BY peut comporter des éléments qui


n'apparaissent pas dans
la liste de sélection. Toutefois, si SELECT DISTINCT est


spécifié ou si
l'instruction SELECT contient un opérateur UNION, les


colonnes de tri
doivent apparaître dans la liste de sélection."


SELECT DISTINCT id2, date_parution FROM table1 ORDER BY


Date_parution
DESC -----> fonctionne
SELECT DISTINCT id2 FROM table1 ---> fonctionne



"Elo" a écrit dans


le message de
news:2345a01c45e7f$7329e700$
Bonjour,

J'essaie de mettre en place une procédure stockée, mais
j'ai un peu de mal.
Je voudrais faire un distinct sur les enregistrements à
renvoyer ainsi qu'un order by, mais Visual studio ne




veut
pas me l'enregsitrer.

Voici ma procédure stockée :

ALTER PROCEDURE myProc

AS
SELECT DISTINCT id2
FROM table1
WHERE date_parution<getdate()
AND id2 IN (
SELECT id
FROM table2
)
ORDER BY date_parution DESC

Quand je veux l'enregistrer il me dit Erreur ADO : ORDER
BY items must appear in the select list if SELECT
DISTINCT is specified.

Quelqu'un a une idée de ce qui ne va pas ?

Merci d'avance.

Elo


.





.



Avatar
Cedric
Les clauses DISTINCT ne sont pas vraiment optimisées en terme de
performances... Et les clauses IN idem !

La clause IN peut être évitée par l'utilisation d'une simple jointure, le
cas échéant, ou si ce n'est pas possible, par l'utilisation d'une vue
intermédiaire.

Ainsi ta requête pourrait être

SELECT TOP 3 id1
FROM table1 INNER JOIN table2
ON table1.id1 = table2.id2
GROUP BY
id1
HAVING
table2.actif!=0 AND
table1.date_parution<getdate()


Bon, syntaxe à vérifier, évidemment (j'ai écrit ça à l'arrache ;-))

Bon courage