2009-09-13 7 views
1

En utilisant sqlite3, j'ai deux tables: produits, commandes. Je veux savoir combien il reste de produits dans le magasin.Get Product Onhand Quantité

SELECT pid, 
     txt, 
     price, 
     qty-coalesce((SELECT SUM(qty) 
         FROM ORDERS 
         WHERE pid=?),0) 
    FROM PRODUCTS 
WHERE pid=? 

Cela fonctionne si je choisis 1 produit, je voudrais une liste de tous mes produits?

+0

@Gert: Mise à jour, ai-je bien compris? –

Répondre

0

Je recommande d'utiliser:

SELECT t.pid, 
      t.txt, 
      t.price, 
      t.qty - IFNULL(qs.qty_sold, 0) 'onhand_qty' 
    FROM PRODUCTS t 
LEFT JOIN (SELECT o.pid, 
        SUM(o.qty) 'qty_sold' 
      FROM ORDERS o) qs ON qs."o.pid" = t.pid 
    WHERE t.pid = ? 

Bien que cela fonctionne, en utilisant des instructions correllated SELECT dans la clause SELECT aura la plus mauvaise performance parce qu'ils exécutent une fois pour chaque ligne renvoyée dans votre requête.

IFNULL est préférable à utiliser dans ce cas par rapport à COALESCE. COALESCE est destiné à vérifier que les valeurs 2+ sont nulles, donnant une fausse impression quand quelqu'un d'autre lit votre code. Il n'y a aucun avantage inhérent - selon la documentation, ils sont identiques.

Référence: SQLite Core Functions

+0

@Gert: Pas tout à fait sûr, mais quand j'ai relu il était plus évident que vous n'auriez pas une somme nulle, sauf s'il n'y avait pas d'enregistrements ORDERS pour le produit. –

+0

@Gert: Pas de meilleures performances que d'utiliser un SELECT dans le SELECT? Je trouve cela difficile à croire, mais ils connaissent mieux l'optimiseur que moi. Vérifiez si vous pouvez générer des plans d'explication pour les deux façons de comparer. –

2
SELECT 
    P.pid, P.txt, P.price, 
     P.qty - coalesce((SELECT sum(O.qty) FROM orders O WHERE O.pid = P.pid), 0) 
FROM products P 
1

Essayez ceci:

SELECT 
    pid, 
    txt, 
    price, 
    qty-coalesce(
     (SELECT sum(qty) 
     FROM orders 
     WHERE orders.pid = products.pid),0) 
FROM products