Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Réécriture de requête

3 réponses
Avatar
hassan007
Bonjour a tous,
Je cherche une façon plus propre pour réécrire cette requête
Merci d’avance


update matable013
set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
JOIN matable008 p8 ON p9.id_cl=p8.id_cl
where p9.id_st=p8.id_st and
p8.compatibilite='v'
and matable013.fa=cg.fa and p8.id_st<>-1
and cg.id_fa<>69),

set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
JOIN matable008 p8 ON p9.id_cl=p8.id_cl
where p9.id_st=p8.id_st and
p8.compatibilite='o'
and matable013.fa=cg.fa and p8.id_st<>-1
and cg.id_fa<>69),


--
hassancf

3 réponses

Avatar
Fred BROUARD
hassan007 a écrit :
Bonjour a tous,
Je cherche une façon plus propre pour réécrire cette requête
Merci d’avance


update matable013
set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
JOIN matable008 p8 ON p9.id_cl=p8.id_cl
where p9.id_st=p8.id_st and
p8.compatibilite='v'
and matable013.fa=cg.fa and p8.id_st<>-1
and cg.id_fa<>69),

set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
JOIN matable008 p8 ON p9.id_cl=p8.id_cl
where p9.id_st=p8.id_st and
p8.compatibilite='o'
and matable013.fa=cg.fa and p8.id_st<>-1
and cg.id_fa<>69),




votre requête est syntaxiquement fausse il ne peut y avoir deux fois le
mot clef SET.

Commencez par l'écrire de manière compréhensible et propre et notamment
en l'indentant. Ne mélangez pas les jointures dans les ON et le WHERE.

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
hassan007
Bonjour,

update matable013
set C1 = (SELECT COUNT(*)
FROM matable013 INNER JOIN CG on matable013.fan = CG.FAN INNER JOIN
matable009 p9 ON CG.ID_PR = p9.ID_PR INNER JOIN
matable008 p8 ON p9.ID_CL= p8.ID_CL and p9.ID_ST =
p8.ID_ST
WHERE (p8.COM = 'v') AND (p8.ID_ST <> - 1) AND (CG.ID_FA <> 69)),

C2 = (SELECT COUNT(*)
FROM matable013 INNER JOIN CG on matable013.fan = CG.FAN INNER JOIN
matable009 p9 ON CG.ID_PR = p9.ID_PR INNER JOIN
matable008 p8 ON p9.ID_CL= p8.ID_CL and p9.ID_ST =
p8.ID_ST
WHERE (p8.COM = 'o') AND (p8.ID_ST <> - 1) AND (CG.ID_FA <> 69))

Merci d'avance

--
hassancf


"Fred BROUARD" a écrit :

hassan007 a écrit :
> Bonjour a tous,
> Je cherche une façon plus propre pour réécrire cette requête
> Merci d’avance
>
>
> update matable013
> set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
> JOIN matable008 p8 ON p9.id_cl=p8.id_cl
> where p9.id_st=p8.id_st and
> p8.compatibilite='v'
> and matable013.fa=cg.fa and p8.id_st<>-1
> and cg.id_fa<>69),
>
> set C1 = (select count(*) from cg JOIN matable009 p9 ON cg.id_pro=p9.id_pro
> JOIN matable008 p8 ON p9.id_cl=p8.id_cl
> where p9.id_st=p8.id_st and
> p8.compatibilite='o'
> and matable013.fa=cg.fa and p8.id_st<>-1
> and cg.id_fa<>69),
>
>
votre requête est syntaxiquement fausse il ne peut y avoir deux fois le
mot clef SET.

Commencez par l'écrire de manière compréhensible et propre et notamment
en l'indentant. Ne mélangez pas les jointures dans les ON et le WHERE.

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Avatar
Fred BROUARD
hassan007 a écrit :
Bonjour,

update matable013
set C1 = (SELECT COUNT(*)
FROM matable013 INNER JOIN CG on matable013.fan = CG.FAN INNER JOIN
matable009 p9 ON CG.ID_PR = p9.ID_PR INNER JOIN
matable008 p8 ON p9.ID_CL= p8.ID_CL and p9.ID_ST =
p8.ID_ST
WHERE (p8.COM = 'v') AND (p8.ID_ST <> - 1) AND (CG.ID_FA <> 69)),

C2 = (SELECT COUNT(*)
FROM matable013 INNER JOIN CG on matable013.fan = CG.FAN INNER JOIN
matable009 p9 ON CG.ID_PR = p9.ID_PR INNER JOIN
matable008 p8 ON p9.ID_CL= p8.ID_CL and p9.ID_ST =
p8.ID_ST
WHERE (p8.COM = 'o') AND (p8.ID_ST <> - 1) AND (CG.ID_FA <> 69))

Merci d'avance




Essayez :

UPDATE matable013
SET C1 = SUM(CASE
WHEN p8.COM = 'v' THEN 1
ELSE 0
END),
C2 = SUM(CASE
WHEN p8.COM = 'o' THEN 1
ELSE 0
END)
FROM matable013 T
INNER JOIN CG
ON T.fan = CG.FAN
INNER JOIN matable009 p9
ON CG.ID_PR = p9.ID_PR
INNER JOIN matable008 p8
ON p9.ID_CL = p8.ID_CL
and p9.ID_ST = p8.ID_ST
WHERE p8.ID_ST <> - 1
AND CG.ID_FA <> 69

Vérifiez si des index sont présents sur :
1) matable008 (ID_CL, ID_ST)
2) matable009 (ID_CL, ID_ST)
3) CG (ID_FA)
4) matable009 (ID_PR)
5) CG (FAN)
6) matable013 (fan)

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************