使用sqlite3,我有两个表:产品,订单。我想知道商店里有多少产品。获取产品Onhand Quantity
SELECT pid,
txt,
price,
qty-coalesce((SELECT SUM(qty)
FROM ORDERS
WHERE pid=?),0)
FROM PRODUCTS
WHERE pid=?
这个工作,如果我选择1产品,我想我所有的产品清单?
使用sqlite3,我有两个表:产品,订单。我想知道商店里有多少产品。获取产品Onhand Quantity
SELECT pid,
txt,
price,
qty-coalesce((SELECT SUM(qty)
FROM ORDERS
WHERE pid=?),0)
FROM PRODUCTS
WHERE pid=?
这个工作,如果我选择1产品,我想我所有的产品清单?
我建议使用:
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 = ?
虽然它的工作原理,使用SELECT子句中correllated SELECT语句将会有表现最差,因为他们正在执行一次对于查询中返回的每一行。
与COALESCE相比,IFNULL在这种情况下更适合使用。 COALESCE旨在检查2+值为空,当别人读取您的代码时给人一种错误的印象。没有任何固有的好处 - 根据文件,它们是相同的。
@Gert:不完全确定,但是当我重新阅读时,更明显的是,除非产品没有ORDERS记录,否则不会有空的总和。 – 2009-09-15 19:56:31
@Gert:在SELECT中使用SELECT不会有比使用SELECT更好的性能吗?我觉得很难相信,但他们会比我更了解优化器。检查是否可以生成解释计划,以便两种方式进行比较。 – 2009-09-17 01:53:29
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
试试这个:
SELECT
pid,
txt,
price,
qty-coalesce(
(SELECT sum(qty)
FROM orders
WHERE orders.pid = products.pid),0)
FROM products
@Gert:更新,我得到它的权利? – 2009-09-16 18:43:47