使用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