Je souhaite obtenir la somme des livres et des stylos de la table des éléments en fonction de comp_id et expirationdate de l'élément et du plan des tables.

Voici à quoi ressemblent les tableaux:

enter image description here

Je veux obtenir la somme des livres et des stylos pour comp_id = 1; la sortie doit être de 15 pour les livres et de 30 pour les stylos.

J'ai cette requête et cela fonctionne bien

SELECT SUM(books) AS books, SUM(pens) AS pens
FROM plan 
JOIN item ON plan.id = item.plan_id 
          AND item.comp_id = '1'  
          AND (item.expiry IS NULL OR item.expiry > NOW()) ;

Comment puis-je simplement la requête ci-dessus?

Quelqu'un pourrait-il m'aider avec ça? Merci

sql
0
someuser2491 29 avril 2020 à 15:05

2 réponses

Meilleure réponse

Je pourrais faire quelques suggestions.

  1. Séparez la condition de jointure de la logique de filtrage, cela rend l'intention de la requête un peu plus claire.
  2. Utiliser l'alias de table
  3. Utilisez COALESCE (item.expiry, DATE '9999-12-31') qui supprime la condition OR.
SELECT SUM(p.books) AS books, SUM(p.pens) AS pens
FROM plan p
  JOIN item i ON i.plan_id = p.id
WHERE i.comp_id = '1'
  AND COALESCE(i.expiry, DATE '9999-12-31') > NOW();
1
Tommy 29 avril 2020 à 13:32

Si vous effectuez une sélection dans un ensemble de données assez volumineux, vous pouvez obtenir de meilleures performances en n'utilisant pas de fonction à l'intérieur de votre JOIN. Vous pouvez déclarer une valeur pour Now () en haut et utiliser la variable dans votre jointure. C'est une façon d'augmenter les performances. Mais dans ce petit jeu de données, cela n'aura aucune importance. Vous pouvez également séparer la dernière partie de votre jointure en une clause where. Cela peut mieux optimiser.

DECLARE @date datetime
select @date = NOW()

SELECT SUM(books) AS books, SUM(pens) AS pens
FROM plan 
JOIN item ON plan.id = item.plan_id
WHERE item.comp_id = '1' AND (item.expiry IS NULL OR item.expiry > @date) ;
0
jpock76 29 avril 2020 à 13:32