繁体   English   中英

库存应用程序的复杂SQL查询

[英]Complex SQL query for inventory app

给定以下2个表,我需要找到具有正确数量的所有零件的仓库,以制造特定的工具包,或更合适的是,每个仓库可以构建多少个工具包。

库存表:仓库,零件和现有数量
套件表:套件,零件,QuantityForKit

例如:Kit1需要Part1的一部分,Part2的2和Part3的1。 仓库A具有20个Part1、5个Part2和3个Part3。 仓库B有5个Part1、10个Part2和没有Part3。

Warehouse A只能构建2个Kit1,因为它没有足够的Part2来制造两个以上的Kit。 仓库B无法构建任何Kit1,因为它没有所有必需的零件。

我有以下可行的演示,但它看起来确实很麻烦,并且主要使用表/索引扫描。 我们的库存表很大,运行速度太慢。 我正在寻找一种更好的方法来完成同样的事情。 在演示中,存在无限的交叉联接,但在实际应用中,它仅限于一个套件。

CREATE TABLE #warehouse
(
    Warehouse CHAR(1) NOT NULL PRIMARY KEY
)
INSERT INTO #warehouse VALUES ('A')
INSERT INTO #warehouse VALUES ('B')
INSERT INTO #warehouse VALUES ('C')
INSERT INTO #warehouse VALUES ('D')

CREATE TABLE #inventory
(
    Warehouse CHAR(1) NOT NULL ,
    Part INT NOT NULL ,
    OnHand INT NOT NULL ,
    CONSTRAINT pk_inventory PRIMARY KEY CLUSTERED (Part, Warehouse)
)
INSERT INTO #inventory VALUES ('A', 1, 20)
INSERT INTO #inventory VALUES ('A', 2, 5)
INSERT INTO #inventory VALUES ('A', 3, 3)
INSERT INTO #inventory VALUES ('B', 1, 5)
INSERT INTO #inventory VALUES ('B', 2, 10)
INSERT INTO #inventory VALUES ('C', 1, 1)
INSERT INTO #inventory VALUES ('C', 3, 1)
INSERT INTO #inventory VALUES ('D', 1, 1)
INSERT INTO #inventory VALUES ('D', 2, 2)
INSERT INTO #inventory VALUES ('D', 3, 1)

CREATE TABLE #kit
(
    Kit INT NOT NULL ,
    Part INT NOT NULL ,
    Quantity INT NOT NULL ,
    CONSTRAINT pk_kit PRIMARY KEY CLUSTERED (Kit, Part)
)
INSERT INTO #kit VALUES (1, 1, 1)
INSERT INTO #kit VALUES (1, 2, 2)
INSERT INTO #kit VALUES (1, 3, 1)
INSERT INTO #kit VALUES (2, 1, 1)
INSERT INTO #kit VALUES (2, 2, 1)


    -- Here's the statement I need to optimize
SELECT 
    Warehouse, 
    Kit, 
    MIN(Capacity) AS [Capacity]
FROM
    (
    SELECT 
        A.Warehouse, 
        A.Kit, 
        A.Part, 
        ISNULL(B.OnHand, 0) AS [Quantity], 
        ISNULL(B.OnHand, 0) / A.Quantity AS Capacity 
    FROM 
        (
        SELECT * 
        FROM 
            #warehouse
            CROSS JOIN
                            -- (SELECT * FROM
            #kit
                            -- WHERE #kit.Kit = @Kit) K
        ) A
        LEFT OUTER JOIN
        #inventory B
            ON A.Warehouse = B.Warehouse
            AND A.Part = B.Part
    ) C
GROUP BY
    Warehouse, 
    Kit
;

建议表示赞赏。

尝试这个:

SELECT warehouse, MIN(capacity) FROM (
  SELECT i.warehouse, i.onhand / k.quantity as capacity
  FROM #kit k
  JOIN #inventory i
    ON k.part = i.part AND k.quantity <= i.onhand
  WHERE k.kit = @kit) c
GROUP BY warehouse
HAVING COUNT(*) = (SELECT COUNT(*) FROM #kit WHERE kit = @kit)

sqlfiddle 在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM