如何连接两个或多个子查询或子选择

问题描述

我不知道如何命名,因为我不确定如何解决或者是否可以解决

我有一份由不同组件制成的产品清单,我想知道我可以生产多少产品,考虑到这些组件可以通过其他一些组件生产。

假设这是我的产品结构表:

CODE      COMPONENT      NEEDED
PROD1     BLISTER         1
PROD1     Box             1
PROD1     TOY             1
TOY       RIGHT ARM       1
TOY       LEFT ARM        1
TOY       EYE             2

我有这只股票:

CODE        STOCK
PROD1       100
BLISTER     100
Box         50
TOY         15
RIGHT ARM   20
LEFT ARM    20
EYE         40

通过这个子选择,我知道每个代码可以生成多少个:

(SELECT min(isnull(STK.STOCK/STR.NEEDED,0))
    from        STRUCTURE STR
    left join   STOCKWAREHOUSE STK 
       on STR.COMPONENT = STK.CODE
    where       STR.CODE = ART.CODE) as PRODUCIBLE

现在显示如下:

CODE       PRODUCIBLE
PROD1      15
TOY        20

我不知道如何计算我也可以生产的组件(例如玩具)。我想我应该连接该表两次,连接到自身,但我不知道如何将每个组件与该组件的可生产量相加。

想要的结果是这样的:

CODE      PRODUCIBLE
PROD1     35 
TOY       20

编辑:

多亏了答案,我设法总结了两个产品,但它没有按预期工作。假设一个盒子由这些组件组成:

COMPONENT       STOCK         PRODUCIBLE
TOY1            400           150
TOY2            150           100
TOY3            0             100
TOY4            100           10

现在,它计算第一层盒子的最小可生产量:0(因为TOY3),第二层的最小可生产量:10(因为TOY4),然后将两者相加:0+ 10.我需要将库存与可生产量相加,返回 100。

问我是否需要澄清任何事情。非常感谢!

EDIT2: Nvm,通过从主表调用组件并对其库存求和来修复。

解决方法

这看起来像一个业务逻辑,所以我认为你不应该在数据库级别这样做。

下面的查询应该会为您提供的数据提供您想要的输出。

第一个子查询是您提供的,第二个子查询在组件级别查看相同的输出。最后,您将在选择中添加可生产的。

select a.code1 as Code,a.p1 + isnull(c.p,0) as PRODUCIBLE
from 
  (
SELECT STR.CODE code1,min(isnull(STK.STOCK/STR.NEEDED,0))   p1
    from        STRUCTURE STR
    left join   STOCK STK 
       on STR.COMPONENT = STK.CODE
  GROUP BY STR.CODE 
      ) as a 

 full outer join 
  (
   select s.CODE code,code component,b.p
   from STRUCTURE s 
   join 
   (SELECT  STR.CODE code,0))  p
    from        STRUCTURE STR
    left join   STOCK STK 
       on STR.COMPONENT = STK.CODE
  GROUP BY STR.CODE 
   ) as  b  on b.code = s.COMPONENT
   ) as c on a.code1 = c.code 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...