【问题标题】:Get Product Onhand Quantity获取产品现有数量
【发布时间】:2009-09-13 14:35:04
【问题描述】:

使用 sqlite3,我有两个表:产品、订单。我想知道商店里还剩多少产品。

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

如果我选择 1 个产品,这可行,我想要一份我所有产品的列表?

【问题讨论】:

  • @Gert:更新了,我说对了吗?

标签: sql sqlite


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      我推荐使用:

         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 子句中使用相关 SELECT 语句的性能最差,因为它们对查询中返回的每一行执行一次。

      在这种情况下,与 COALESCE 相比,最好使用 IFNULL。 COALESCE 旨在检查 2+ 值是否为空,当其他人阅读您的代码时给人一种错误的印象。没有任何固有的好处 - 根据文档,它们是相同的。

      参考:SQLite Core Functions

      【讨论】:

      • @Gert:不完全确定,但是当我重新阅读时,更明显的是,除非产品没有 ORDERS 记录,否则您不会有空总和。
      • @Gert:性能不比在 SELECT 中使用 SELECT 更好吗?我觉得这很难相信,但他们会比我更了解优化器。检查您是否可以为两种比较方式生成解释计划。
      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多