J'ai une requete qui fonctionne tr=E8s bien lorsque je la=20
lance sans crit=E8re ou selon certain crit=E8re mais qui=20
plante lorsque je rentre d'autre crit=E8res. Je m'explique
J'ai une requete qui m'affiche toutes les machines de=20
plusieurs pays qui sont HS. Cette requete fonctionne=20
correctement toute seule.
Lorsque je rentre un crit=E8re correspondant =E0 un pays (ex :=20
1 pour la France), elle fonctionne aussi. Par contre, si=20
je rentre le crit=E8re 2 ou 3 (correspondant =E0 l'Espagne et=20
=E0 l'Angleterre), j'ai le message d=E9lai d'attente d=E9pass=E9.
Pourquoi elle fonctionne selon le crit=E8re ??
Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE,=20
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,=20
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,=20
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,=20
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =3D=20
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =3D dbo.PAYS.ID_PAYS=20
ON dbo.REGIONS.ID_DR =3D dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =3D=20
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =3D=20
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE =3D dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,=20
dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE
C'est un peu fouilli, mais cette vue appelle une autre=20
vue :
SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,=20
dbo.MATCHREQUEST.DateMatchRequest,=20
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP,=20
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, =20
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =3D=20
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =3D dbo.PAYS.ID_PAYS=20
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR =3D dbo.REGIONS.ID_DR=20
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =3D=20
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =3D=20
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,=20
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,=20
dbo.AFFAIRES.VILLE,=20
dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,=20
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE,=20
dbo.REGIONS.REGION,=20
dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine
HAVING (dbo.MATCHREQUEST.DateMatchRequest =3D CONVERT
(char(10), GETDATE(), 103))
Si vous me comprenez et que vous pouvez m'aider, je vous=20
en serais reconnaissant
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
Fred BROUARD
Quel est l'intérêt du TOP 100 PRECENT ?
Pourquoi utiliser un HAVING et un GROUP BY sans agrégat ???
si ce n'est que de bouffer du processeur et donc du temps !
de plus l'utilisant de nom d'objet anormatif comme "MODULE2-BORNES OK" avec espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, MAX(M.DateMatchRequest) AS [Date], MAX(M.HeureMatchRequest) AS Heure, Q.ID_PLAQUE
FROM REGIONS R INNER JOIN AFFAIRES A ON R.ID_DR = A.ID_DR INNER JOIN BORNES B ON A.ID_AFFAIRE = B.ID_AFFAIRE INNER JOIN MATCHREQUEST M ON B.BORNE = M.NomMachine LEFT OUTER JOIN [MODULE2-BORNES OK] OK ON B.BORNE = OK.BORNE INNER JOIN PAYS P ON A.ID_PAYS = P.ID_PAYS LEFT OUTER JOIN PLAQUES Q A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace le HAVING par un Filtre WHERE Essaye aussi de mettre un LEFT OUTER JOIN plutôt que d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la lance sans critère ou selon certain critère mais qui plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de plusieurs pays qui sont HS. Cette requete fonctionne correctement toute seule. Lorsque je rentre un critère correspondant à un pays (ex : 1 pour la France), elle fonctionne aussi. Par contre, si je rentre le critère 2 ou 3 (correspondant à l'Espagne et à l'Angleterre), j'ai le message délai d'attente dépassé.
Pourquoi elle fonctionne selon le critère ?? Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date], MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure, dbo.PLAQUES.ID_PLAQUE FROM dbo.REGIONS INNER JOIN dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo. [MODULE2-BORNES OK].BORNE WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL) GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE
C'est un peu fouilli, mais cette vue appelle une autre vue :
SELECT TOP 100 PERCENT dbo.MATCHREQUEST.NomMachine AS BORNE, dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE FROM dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS INNER JOIN dbo.REGIONS ON dbo.AFFAIRES.ID_DR = dbo.REGIONS.ID_DR RIGHT OUTER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE GROUP BY dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine HAVING (dbo.MATCHREQUEST.DateMatchRequest = CONVERT (char(10), GETDATE(), 103))
Si vous me comprenez et que vous pouvez m'aider, je vous en serais reconnaissant
-- Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com ************************ www.datasapiens.com *************************
Quel est l'intérêt du TOP 100 PRECENT ?
Pourquoi utiliser un HAVING et un GROUP BY sans agrégat ???
si ce n'est que de bouffer du processeur et donc du temps !
de plus l'utilisant de nom d'objet anormatif comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
MAX(M.DateMatchRequest) AS [Date],
MAX(M.HeureMatchRequest) AS Heure,
Q.ID_PLAQUE
FROM REGIONS R
INNER JOIN AFFAIRES A
ON R.ID_DR = A.ID_DR
INNER JOIN BORNES B
ON A.ID_AFFAIRE = B.ID_AFFAIRE
INNER JOIN MATCHREQUEST M
ON B.BORNE = M.NomMachine
LEFT OUTER JOIN [MODULE2-BORNES OK] OK
ON B.BORNE = OK.BORNE
INNER JOIN PAYS P
ON A.ID_PAYS = P.ID_PAYS
LEFT OUTER JOIN PLAQUES Q
A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace le HAVING par un Filtre
WHERE
Essaye aussi de mettre un LEFT OUTER JOIN plutôt que d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la
lance sans critère ou selon certain critère mais qui
plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de
plusieurs pays qui sont HS. Cette requete fonctionne
correctement toute seule.
Lorsque je rentre un critère correspondant à un pays (ex :
1 pour la France), elle fonctionne aussi. Par contre, si
je rentre le critère 2 ou 3 (correspondant à l'Espagne et
à l'Angleterre), j'ai le message délai d'attente dépassé.
Pourquoi elle fonctionne selon le critère ??
Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE,
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE
C'est un peu fouilli, mais cette vue appelle une autre
vue :
SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,
dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP,
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR = dbo.REGIONS.ID_DR
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE,
dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE,
dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine
HAVING (dbo.MATCHREQUEST.DateMatchRequest = CONVERT
(char(10), GETDATE(), 103))
Si vous me comprenez et que vous pouvez m'aider, je vous
en serais reconnaissant
--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Pourquoi utiliser un HAVING et un GROUP BY sans agrégat ???
si ce n'est que de bouffer du processeur et donc du temps !
de plus l'utilisant de nom d'objet anormatif comme "MODULE2-BORNES OK" avec espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, MAX(M.DateMatchRequest) AS [Date], MAX(M.HeureMatchRequest) AS Heure, Q.ID_PLAQUE
FROM REGIONS R INNER JOIN AFFAIRES A ON R.ID_DR = A.ID_DR INNER JOIN BORNES B ON A.ID_AFFAIRE = B.ID_AFFAIRE INNER JOIN MATCHREQUEST M ON B.BORNE = M.NomMachine LEFT OUTER JOIN [MODULE2-BORNES OK] OK ON B.BORNE = OK.BORNE INNER JOIN PAYS P ON A.ID_PAYS = P.ID_PAYS LEFT OUTER JOIN PLAQUES Q A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace le HAVING par un Filtre WHERE Essaye aussi de mettre un LEFT OUTER JOIN plutôt que d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la lance sans critère ou selon certain critère mais qui plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de plusieurs pays qui sont HS. Cette requete fonctionne correctement toute seule. Lorsque je rentre un critère correspondant à un pays (ex : 1 pour la France), elle fonctionne aussi. Par contre, si je rentre le critère 2 ou 3 (correspondant à l'Espagne et à l'Angleterre), j'ai le message délai d'attente dépassé.
Pourquoi elle fonctionne selon le critère ?? Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date], MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure, dbo.PLAQUES.ID_PLAQUE FROM dbo.REGIONS INNER JOIN dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo. [MODULE2-BORNES OK].BORNE WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL) GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PLAQUES.ID_PLAQUE
C'est un peu fouilli, mais cette vue appelle une autre vue :
SELECT TOP 100 PERCENT dbo.MATCHREQUEST.NomMachine AS BORNE, dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE FROM dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS INNER JOIN dbo.REGIONS ON dbo.AFFAIRES.ID_DR = dbo.REGIONS.ID_DR RIGHT OUTER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE GROUP BY dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.REGIONS.REGION, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE, dbo.MATCHREQUEST.NomMachine HAVING (dbo.MATCHREQUEST.DateMatchRequest = CONVERT (char(10), GETDATE(), 103))
Si vous me comprenez et que vous pouvez m'aider, je vous en serais reconnaissant
-- Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com ************************ www.datasapiens.com *************************
Alexandre LECOQ
Bonjour Fred et merci pour ton aide, la modification que tu as faites sur ma requete me permet de nouveau d'obtenir les résultats (encore une peu longue pour l'espagne, mais je vais analyser ça). Par contre, tu me demandes d'utiliser un LEFT OUTER JOIN plutot qu'un RIGHT, quelle est la différence entre les deux.
Encore merci et à bientôt.
Alexandre LECOQ
-----Message d'origine----- Quel est l'intérêt du TOP 100 PRECENT ?
Pourquoi utiliser un HAVING et un GROUP BY sans
agrégat ???
si ce n'est que de bouffer du processeur et donc du
temps !
de plus l'utilisant de nom d'objet anormatif
comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, MAX(M.DateMatchRequest) AS [Date], MAX(M.HeureMatchRequest) AS Heure, Q.ID_PLAQUE
FROM REGIONS R INNER JOIN AFFAIRES A ON R.ID_DR = A.ID_DR INNER JOIN BORNES B ON A.ID_AFFAIRE = B.ID_AFFAIRE INNER JOIN MATCHREQUEST M ON B.BORNE = M.NomMachine LEFT OUTER JOIN [MODULE2-BORNES OK] OK ON B.BORNE = OK.BORNE INNER JOIN PAYS P ON A.ID_PAYS = P.ID_PAYS LEFT OUTER JOIN PLAQUES Q A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace
le HAVING par un Filtre
WHERE Essaye aussi de mettre un LEFT OUTER JOIN plutôt que
d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour
aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la lance sans critère ou selon certain critère mais qui plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de plusieurs pays qui sont HS. Cette requete fonctionne correctement toute seule. Lorsque je rentre un critère correspondant à un pays
(ex :
1 pour la France), elle fonctionne aussi. Par contre,
si
je rentre le critère 2 ou 3 (correspondant à l'Espagne
et
à l'Angleterre), j'ai le message délai d'attente
dépassé.
Pourquoi elle fonctionne selon le critère ?? Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date], MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure, dbo.PLAQUES.ID_PLAQUE FROM dbo.REGIONS INNER JOIN dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =
dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo. [MODULE2-BORNES OK].BORNE WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL) GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
C'est un peu fouilli, mais cette vue appelle une autre vue :
SELECT TOP 100 PERCENT dbo.MATCHREQUEST.NomMachine AS BORNE, dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest,
dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE FROM dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS INNER JOIN dbo.REGIONS ON dbo.AFFAIRES.ID_DR =
dbo.REGIONS.ID_DR
RIGHT OUTER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE GROUP BY dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest,
Si vous me comprenez et que vous pouvez m'aider, je
vous
en serais reconnaissant
-- Frédéric BROUARD, MVP SQL Server. Expert SQL /
spécialiste Delphi, web
Livre SQL - col. Référence :
http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros :
http://sqlpro.developpez.com
************************ www.datasapiens.com
*************************
.
Bonjour Fred et merci pour ton aide, la modification que
tu as faites sur ma requete me permet de nouveau d'obtenir
les résultats (encore une peu longue pour l'espagne, mais
je vais analyser ça).
Par contre, tu me demandes d'utiliser un LEFT OUTER JOIN
plutot qu'un RIGHT, quelle est la différence entre les
deux.
Encore merci et à bientôt.
Alexandre LECOQ
-----Message d'origine-----
Quel est l'intérêt du TOP 100 PRECENT ?
Pourquoi utiliser un HAVING et un GROUP BY sans
agrégat ???
si ce n'est que de bouffer du processeur et donc du
temps !
de plus l'utilisant de nom d'objet anormatif
comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
MAX(M.DateMatchRequest) AS [Date],
MAX(M.HeureMatchRequest) AS Heure,
Q.ID_PLAQUE
FROM REGIONS R
INNER JOIN AFFAIRES A
ON R.ID_DR = A.ID_DR
INNER JOIN BORNES B
ON A.ID_AFFAIRE = B.ID_AFFAIRE
INNER JOIN MATCHREQUEST M
ON B.BORNE = M.NomMachine
LEFT OUTER JOIN [MODULE2-BORNES OK] OK
ON B.BORNE = OK.BORNE
INNER JOIN PAYS P
ON A.ID_PAYS = P.ID_PAYS
LEFT OUTER JOIN PLAQUES Q
A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE,
A.AFFAIRE,
A.VILLE,
A.CP,
R.REGION,
B.COMMENTAIRE,
P.ID_PAYS,
R.ID_DR,
Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace
le HAVING par un Filtre
WHERE
Essaye aussi de mettre un LEFT OUTER JOIN plutôt que
d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour
aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la
lance sans critère ou selon certain critère mais qui
plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de
plusieurs pays qui sont HS. Cette requete fonctionne
correctement toute seule.
Lorsque je rentre un critère correspondant à un pays
(ex :
1 pour la France), elle fonctionne aussi. Par contre,
si
je rentre le critère 2 ou 3 (correspondant à l'Espagne
et
à l'Angleterre), j'ai le message délai d'attente
dépassé.
Pourquoi elle fonctionne selon le critère ??
Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE,
dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE,
dbo.AFFAIRES.CP, dbo.REGIONS.REGION,
dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date],
MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure,
dbo.PLAQUES.ID_PLAQUE
FROM dbo.REGIONS INNER JOIN
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =
dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN
dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo.
[MODULE2-BORNES OK].BORNE
WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL)
GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
C'est un peu fouilli, mais cette vue appelle une autre
vue :
SELECT TOP 100 PERCENT
dbo.MATCHREQUEST.NomMachine AS BORNE,
dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest,
dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP,
dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION,
dbo.PLAQUES.ID_PLAQUE
FROM
dbo.AFFAIRES INNER JOIN
dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE =
dbo.BORNES.ID_AFFAIRE INNER JOIN
dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS
INNER JOIN
dbo.REGIONS ON dbo.AFFAIRES.ID_DR =
dbo.REGIONS.ID_DR
RIGHT OUTER JOIN
dbo.MATCHREQUEST ON dbo.BORNES.BORNE =
dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN
dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE =
dbo.PLAQUES.ID_PLAQUE
GROUP BY dbo.MATCHREQUEST.DateMatchRequest,
dbo.MATCHREQUEST.HeureMatchRequest,
Bonjour Fred et merci pour ton aide, la modification que tu as faites sur ma requete me permet de nouveau d'obtenir les résultats (encore une peu longue pour l'espagne, mais je vais analyser ça). Par contre, tu me demandes d'utiliser un LEFT OUTER JOIN plutot qu'un RIGHT, quelle est la différence entre les deux.
Encore merci et à bientôt.
Alexandre LECOQ
-----Message d'origine----- Quel est l'intérêt du TOP 100 PRECENT ?
Pourquoi utiliser un HAVING et un GROUP BY sans
agrégat ???
si ce n'est que de bouffer du processeur et donc du
temps !
de plus l'utilisant de nom d'objet anormatif
comme "MODULE2-BORNES OK" avec
espace et tiret consomme aussi du temps
Pour ta première requête une correction peut être :
SELECT B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, MAX(M.DateMatchRequest) AS [Date], MAX(M.HeureMatchRequest) AS Heure, Q.ID_PLAQUE
FROM REGIONS R INNER JOIN AFFAIRES A ON R.ID_DR = A.ID_DR INNER JOIN BORNES B ON A.ID_AFFAIRE = B.ID_AFFAIRE INNER JOIN MATCHREQUEST M ON B.BORNE = M.NomMachine LEFT OUTER JOIN [MODULE2-BORNES OK] OK ON B.BORNE = OK.BORNE INNER JOIN PAYS P ON A.ID_PAYS = P.ID_PAYS LEFT OUTER JOIN PLAQUES Q A.ID_PLAQUE = Q.ID_PLAQUE
WHERE OK.BORNE IS NULL
GROUP B.BORNE, A.AFFAIRE, A.VILLE, A.CP, R.REGION, B.COMMENTAIRE, P.ID_PAYS, R.ID_DR, Q.ID_PLAQUE
Pour la seconde, supprime le TOP 100 PERCENT, et replace
le HAVING par un Filtre
WHERE Essaye aussi de mettre un LEFT OUTER JOIN plutôt que
d'utiliser le right
Enfin, s'agissant de vues (?) tu peut les indexer pour
aller plus vite
A +
Alexandre LECOQ a écrit:
Bonjour,
J'ai une requete qui fonctionne très bien lorsque je la lance sans critère ou selon certain critère mais qui plante lorsque je rentre d'autre critères. Je m'explique
J'ai une requete qui m'affiche toutes les machines de plusieurs pays qui sont HS. Cette requete fonctionne correctement toute seule. Lorsque je rentre un critère correspondant à un pays
(ex :
1 pour la France), elle fonctionne aussi. Par contre,
si
je rentre le critère 2 ou 3 (correspondant à l'Espagne
et
à l'Angleterre), j'ai le message délai d'attente
dépassé.
Pourquoi elle fonctionne selon le critère ?? Voici ma requete :
SELECT TOP 100 PERCENT dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.AFFAIRES.CP, dbo.REGIONS.REGION, dbo.BORNES.COMMENTAIRE, dbo.PAYS.ID_PAYS, dbo.REGIONS.ID_DR, MAX(dbo.MATCHREQUEST.DateMatchRequest) AS [Date], MAX(dbo.MATCHREQUEST.HeureMatchRequest) AS Heure, dbo.PLAQUES.ID_PLAQUE FROM dbo.REGIONS INNER JOIN dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS =
dbo.PAYS.ID_PAYS
ON dbo.REGIONS.ID_DR = dbo.AFFAIRES.ID_DR INNER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE LEFT OUTER JOIN dbo.[MODULE2-BORNES OK] ON dbo.BORNES.BORNE = dbo. [MODULE2-BORNES OK].BORNE WHERE (dbo.[MODULE2-BORNES OK].BORNE IS NULL) GROUP BY dbo.BORNES.BORNE, dbo.AFFAIRES.AFFAIRE, dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
C'est un peu fouilli, mais cette vue appelle une autre vue :
SELECT TOP 100 PERCENT dbo.MATCHREQUEST.NomMachine AS BORNE, dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest,
dbo.AFFAIRES.AFFAIRE,
dbo.AFFAIRES.VILLE, dbo.PAYS.ID_PAYS,
dbo.REGIONS.ID_DR,
dbo.AFFAIRES.CP, dbo.BORNES.COMMENTAIRE, dbo.REGIONS.REGION, dbo.PLAQUES.ID_PLAQUE FROM dbo.AFFAIRES INNER JOIN dbo.BORNES ON dbo.AFFAIRES.ID_AFFAIRE = dbo.BORNES.ID_AFFAIRE INNER JOIN dbo.PAYS ON dbo.AFFAIRES.ID_PAYS = dbo.PAYS.ID_PAYS INNER JOIN dbo.REGIONS ON dbo.AFFAIRES.ID_DR =
dbo.REGIONS.ID_DR
RIGHT OUTER JOIN dbo.MATCHREQUEST ON dbo.BORNES.BORNE = dbo.MATCHREQUEST.NomMachine LEFT OUTER JOIN dbo.PLAQUES ON dbo.AFFAIRES.ID_PLAQUE = dbo.PLAQUES.ID_PLAQUE GROUP BY dbo.MATCHREQUEST.DateMatchRequest, dbo.MATCHREQUEST.HeureMatchRequest,