Ici: transformations SQL usuelles
Un article de DocAstairs.
| N° | ÉVITEZ | PRÉFÉREZ |
|---|---|---|
| 1 |
évitez d'employer l'étoile dans la clause SELECT... SELECT * FROM T_CLIENT |
...préférez nommer les colonnes une à une SELECT CLI_ID, TIT_CODE, CLI_NOM,
CLI_PRENOM, CLI_ENSEIGNE
FROM T_CLIENT
|
| 2 |
évitez d'employer DISTINCT dans la clause SELECT... SELECT DISTINCT CHB_NUMERO, CHB_ETAGE FROM T_CHAMBRE |
...lorsque cela n'est pas nécessaire SELECT CHB_NUMERO, CHB_ETAGE FROM T_CHAMBRE |
| 3 |
n'employez pas de colonne dans la clause SELECT... de la sous requête EXISTS... SELECT CHB_ID
FROM T_CHAMBRE T1
WHERE
NOT
EXISTS( SELECT CHB_ID
FROM TJ_CHB_PLN_CLI T2
WHERE PLN_JOUR = '2000-11-11'
AND T2.CHB_ID = T1.CHB_ID)
|
...utilisez l'étoile ou une constante SELECT CHB_ID
FROM T_CHAMBRE T1
WHERE NOT EXISTS(SELECT *
FROM TJ_CHB_PLN_CLI T2
WHERE PLN_JOUR = '2000-11-11'
T2.CHB_ID = T1.CHB_ID)
|
| 4 |
évitez de compter une colonne... SELECT COUNT (CHB_ID) FROM T_CHAMBRE |
...quand-il suffit de compter les lignes SELECT COUNT (*) FROM T_CHAMBRE |
| 5 |
évitez d'utiliser le LIKE... SELECT * FROM T_CLIENT WHERE CLI_NOM LIKE 'D%' |
...si une fourchette de recherche le permet SELECT * FROM T_CLIENT WHERE CLI_NOM BETWEEN 'D' AND 'E ' |
| 6 |
évitez les jointures dans le WHERE... SELECT * FROM T_CLIENT C, T_FACTURE F WHERE EXTRACT(YEAR FROM F.FAC_DATE) = 2000 AND F.CLI_ID = C.CLI_ID |
...préférez l'opérateur normalisé JOIN SELECT *
FROM T_CLIENT C
JOIN T_FACTURE F
ON F.CLI_ID = C.CLI_ID
WHERE EXTRACT(YEAR FROM F.FAC_DATE) = 2000
|
| 7 |
évitez les fourchettes < et > pour des valeurs discrètes... SELECT * FROM T_FACTURE WHERE FAC_DATE > '2000-06-18' AND FAC_DATE < '2000-07-15' |
...préférez le BETWEEN SELECT *
FROM T_FACTURE
WHERE FAC_DATE BETWEEN '2000-06-18'
AND '2000-07-14'
|
| 8 |
évitez le IN avec des valeurs discrètes recouvrantes... SELECT * FROM T_CHAMBRE WHERE CHB_NUMERO IN (11, 12, 13, 14) |
...préférez le BETWEEN SELECT * FROM T_CHAMBRE WHERE CHB_NUMERO BETWEEN 11 AND 14 |
| 9 |
évitez d'employer le DISTINCT... SELECT DISTINCT CLI_NOM, CLI_PRENOM
FROM T_CLIENT C
JOIN TJ_CHB_PLN_CLI J
ON C.CLI_ID = J.CLI_ID
WHERE PLN_JOUR = '2000-11-11'
|
...si une sous requête EXISTS vous offre le dédoublonnage SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT C
WHERE EXISTS (SELECT *
FROM TJ_CHB_PLN_CLI J
WHERE C.CLI_ID = J.CLI_ID
AND PLN_JOUR = '2000-11-11')
|
| 10 |
évitez les sous requêtes... SELECT CHB_ID
FROM T_CHAMBRE
WHERE CHB_ID NOT IN (SELECT CHB_ID
FROM TJ_CHB_PLN_CLI
WHERE PLN_JOUR = '2000-11-11')
|
...quand vous pouvez utiliser les jointures SELECT DISTINCT C.CHB_ID
FROM T_CHAMBRE C
LEFT OUTER JOIN TJ_CHB_PLN_CLI P
ON C.CHB_ID = P.CHB_ID
AND PLN_JOUR = '2000-11-11'
WHERE P.CHB_ID IS NULL
|
| 11 |
évitez les sous requêtes avec IN... SELECT CHB_ID FROM T_CHAMBRE WHERE CHB_ID NOT IN (SELECT CHB_ID FROM TJ_CHB_PLN_CLI WHERE PLN_JOUR = '2000-11-11') |
...lorsque vous pouvez utiliser EXISTS SELECT CHB_ID FROM T_CHAMBRE T1 WHERE NOT EXISTS (SELECT * FROM TJ_CHB_PLN_CLI T2 WHERE PLN_JOUR = '2000-11-11' AND T2.CHB_ID = T1.CHB_ID) |
| 12 |
transformez les COALESCE... SELECT LIF_ID,
(LIF_QTE * LIF_MONTANT)
* (1 - COALESCE(LIF_REMISE_POURCENT, 0)/100)
- COALESCE(LIF_REMISE_MONTANT, 0) AS TOTAL_LIGNE
FROM T_LIGNE_FACTURE
|
...en UNION SELECT LIF_ID, (LIF_QTE * LIF_MONTANT)
FROM T_LIGNE_FACTURE
WHERE LIF_REMISE_POURCENT IS NULL
AND LIF_REMISE_MONTANT IS NULL
UNION
SELECT LIF_ID, (LIF_QTE * LIF_MONTANT)
- LIF_REMISE_MONTANT
FROM T_LIGNE_FACTURE
WHERE LIF_REMISE_POURCENT IS NULL
AND LIF_REMISE_MONTANT IS NOT NULL
UNION
SELECT LIF_ID, (LIF_QTE * LIF_MONTANT)
* (1 - LIF_REMISE_POURCENT/100)
FROM T_LIGNE_FACTURE
WHERE LIF_REMISE_POURCENT IS NOT NULL>
AND LIF_REMISE_MONTANT IS NULL
UNION
SELECT LIF_ID, (LIF_QTE * LIF_MONTANT)
* (1 - LIF_REMISE_POURCENT/100)
- LIF_REMISE_MONTANT
FROM T_LIGNE_FACTURE
WHERE LIF_REMISE_POURCENT IS NOT NULL
AND LIF_REMISE_MONTANT IS NOT NULL
|
| 13 |
transformez les CASE... SELECT CHB_NUMERO, CASE CHB_ETAGE WHEN 'RDC' THEN 0 WHEN '1er' THEN 1 WHEN '2e' THEN 2 END AS ETAGE, CHB_COUCHAGE FROM T_CHAMBRE ORDER BY ETAGE, CHB_COUCHAGE |
...en UNION SELECT CHB_NUMERO, 0 AS ETAGE, CHB_COUCHAGE FROM T_CHAMBRE WHERE CHB_ETAGE = 'RDC' UNION SELECT CHB_NUMERO, 1 AS ETAGE, CHB_COUCHAGE FROM T_CHAMBRE WHERE CHB_ETAGE = '1er' UNION SELECT CHB_NUMERO, 2 AS ETAGE, CHB_COUCHAGE FROM T_CHAMBRE WHERE CHB_ETAGE = '2e' ORDER BY ETAGE, CHB_COUCHAGE |
| 14 |
transformez les EXCEPT... SELECT CHB_ID FROM T_CHAMBRE EXCEPT SELECT CHB_ID FROM TJ_CHB_PLN_CLI WHERE PLN_JOUR = '2000-11-11'</div> |
<td class="colonne">