mon code fonctionne mais est horrible. y a-t-il un moyen de nettoyer ce code de manière appropriée?
ce code (proc stocké) est utilisé pour rechercher un mot dans différentes colonnes d'une table et des articles qui ont un ID de rôle différent (0-4)
@searchval nvarchar(500),
@arrStatusTyp int,
@rolltypAdmin int,
@roll1 int,
@roll2 int,
@roll3 int,
@roll4 int,
@visningsperiod nvarchar(4)
SELECT kk_aj_tbl_Arrangemang.ArrID
FROM kk_aj_tbl_content INNER JOIN
kk_aj_tbl_arridtoContent ON kk_aj_tbl_content.Contentid = kk_aj_tbl_arridtoContent.contentid INNER JOIN
kk_aj_tbl_Arrangemang ON kk_aj_tbl_arridtoContent.arrid = kk_aj_tbl_Arrangemang.ArrID INNER JOIN
kk_aj_tbl_ArrangemangStatus ON kk_aj_tbl_Arrangemang.ArrangemangStatusID = kk_aj_tbl_ArrangemangStatus.ArrangemangStatusID INNER JOIN
kk_aj_tbl_Konstformtyp ON kk_aj_tbl_Arrangemang.KonstformID = kk_aj_tbl_Konstformtyp.KonstformID INNER JOIN
Users ON kk_aj_tbl_Arrangemang.AdminuserID = Users.UserID INNER JOIN
kk_aj_tbl_utovare ON kk_aj_tbl_Arrangemang.UtovarID = kk_aj_tbl_utovare.UtovarID
WHERE
(kk_aj_tbl_Arrangemang.ArrangemangStatusID = @arrStatusTyp) AND (kk_aj_tbl_arridtoContent.Version=1) AND
(
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%') AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll1) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll2) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll3) OR
(kk_aj_tbl_utovare.Organisation LIKE '%'+@searchval+'%')AND (kk_aj_tbl_Konstformtyp.KonstformID = @roll4)
)
ORDER BY kk_aj_tbl_arridtoContent.datum DESC
merci pour toute l'aide
4 Réponses :
Conditions telles que:
...
WHERE
kk_aj_tbl_Arrangemang.ArrangemangStatusID = @arrStatusTyp
AND kk_aj_tbl_arridtoContent.Version=1
AND kk_aj_tbl_Konstformtyp.KonstformID IN (@roll1, @roll2, @roll3, @roll4)
AND (
kk_aj_tbl_content.Rubrik LIKE '%'+@searchval+'%'
OR kk_aj_tbl_content.Underrubrik LIKE '%'+@searchval+'%'
OR kk_aj_tbl_content.Organisation LIKE '%'+@searchval+'%'
)
Peut être réécrite comme:
cond1 AND (cond2 OR cond3 OR cond4)
Essayez donc la clause WHERE suivante :
(cond1 OR cond2) AND (cond1 OR cond3) AND (cond1 OR cond4) ...
Bon !!! Cela peut également résoudre un problème de performances car la clause OR dans le WHERE peut entraîner de graves problèmes de performances.
Commencez par utiliser un alias de table personnalisé pour ne pas avoir à répéter le nom complet de la table (utilisez un nom significatif, pas A, B, C comme mon exemple). Vous pouvez réécrire vos multiples OU comme IN:
WHERE
A.ArrangemangStatusID = @arrStatusTyp AND
D.Version = 1 AND
(
(B.Rubrik LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4)) OR
(B.Underrubrik LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4)) OR
(C.Organisation LIKE '%' + @searchval + '%' AND E.KonstformID IN (@roll1, @roll2, @roll3, @roll4))
)
Vous n'avez pas besoin de mettre toutes les conditions entre parenthèses, utilisez-les uniquement lorsque nécessaire.
SELECT kk_aj_tbl_arrangemang.arrid
FROM kk_aj_tbl_content
INNER JOIN kk_aj_tbl_arridtocontent
ON kk_aj_tbl_content.contentid = kk_aj_tbl_arridtocontent.contentid
INNER JOIN kk_aj_tbl_arrangemang
ON kk_aj_tbl_arridtocontent.arrid = kk_aj_tbl_arrangemang.arrid
INNER JOIN kk_aj_tbl_arrangemangstatus
ON kk_aj_tbl_arrangemang.arrangemangstatusid = kk_aj_tbl_arrangemangstatus.arrangemangstatusid
INNER JOIN kk_aj_tbl_konstformtyp
ON kk_aj_tbl_arrangemang.konstformid = kk_aj_tbl_konstformtyp.konstformid
INNER JOIN users
ON kk_aj_tbl_arrangemang.adminuserid = users.userid
INNER JOIN kk_aj_tbl_utovare
ON kk_aj_tbl_arrangemang.utovarid = kk_aj_tbl_utovare.utovarid
WHERE ( kk_aj_tbl_arrangemang.arrangemangstatusid = @arrStatusTyp )
AND ( kk_aj_tbl_arridtocontent.version = 1 )
AND ( ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_content.rubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_content.underrubrik LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll1 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll2 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll3 )
OR ( kk_aj_tbl_utovare.organisation LIKE '%' + @searchval + '%' )
AND ( kk_aj_tbl_konstformtyp.konstformid = @roll4 ) )
ORDER BY kk_aj_tbl_arridtocontent.datum DESC
Utilisation de l'alias de table et simplification de la clause WHERE:
SELECT am.ArrID
FROM kk_aj_tbl_content c
INNER JOIN kk_aj_tbl_arridtoContent a2c ON c.Contentid = a2c.contentid
INNER JOIN kk_aj_tbl_Arrangemang am ON a2c.arrid = am.ArrID
INNER JOIN kk_aj_tbl_ArrangemangStatus ams ON am.ArrangemangStatusID = ams.ArrangemangStatusID
INNER JOIN kk_aj_tbl_Konstformtyp kft ON am.KonstformID = kft.KonstformID
INNER JOIN Users u ON am.AdminuserID = u.UserID
INNER JOIN kk_aj_tbl_utovare uto ON am.UtovarID = uto.UtovarID
WHERE am.ArrangemangStatusID = @arrStatusTyp
AND a2c.Version = 1
AND kft.KonstformID in (@roll1,@roll2,@roll3,@roll4)
AND (
c.Rubrik LIKE '%'+@searchval+'%' OR
c.Underrubrik LIKE '%'+@searchval+'%' OR
uto.Organisation LIKE '%'+@searchval+'%'
)
ORDER BY a2c.datum DESC
Pourquoi n'utilisez-vous pas
(kk_aj_tbl_content.Rubrik LIKE '%' + @ searchval + '%') AND (kk_aj_tbl_Konstformtyp.KonstformID dans (@ roll1, @ roll2, @ roll3, @ roll4)?