2009-09-13 4 views
1

Используя sqlite3, у меня есть две таблицы: продукты, заказы. Я хочу знать, сколько продуктов осталось в магазине.Получить продукт Onhand Количество

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

Это работает, если я выберу 1 продукт, мне нужен список всех моих продуктов?

+0

@Gert: Обновленный, я получил это право? –

ответ

0

Я рекомендую использовать:

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 = ? 

Хотя это работает, используя correllated ЗЕЬЕСТА в ЗЕЬЕСТЕ будет иметь худшие показатели, так как они выполняются один раз для каждой строки, возвращаемой в вашем запросе.

IFNULL предпочтительнее использовать в этом случае по сравнению с COALESCE. COALESCE предназначен для проверки значений 2+ для значения null, что создает ложное впечатление, когда кто-то еще читает ваш код. В документации нет каких-либо неотъемлемых преимуществ - они одинаковы.

Ссылка: SQLite Core Functions

+0

@Gert: Не совсем уверен, но когда я перечитал, было более очевидно, что у вас не будет нулевой суммы, если не было записей ORDERS для продукта. –

+0

@Gert: Не лучше производительность, чем использование SELECT в SELECT? Мне трудно поверить, но они лучше знали оптимизатора, чем я. Проверьте, можете ли вы создавать планы объяснений для обоих способов сравнения. –

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

Попробуйте это:

SELECT 
    pid, 
    txt, 
    price, 
    qty-coalesce(
     (SELECT sum(qty) 
     FROM orders 
     WHERE orders.pid = products.pid),0) 
FROM products 
Смежные вопросы