求教一个数据库的问题.
$frage$各位朋友, 你好.
小弟最近做一个有关Access数据库的作业时碰到一个计算和同个组件汇总的问题.具体如下:
A 产品 由 2个B1, 2个B2 和 2个A2构成
B1由3个C11 和 3个C12 组成
A2由3个B1 和 3个C12 组成
老师的要求是:
系统能够自动计算出: A 由2个B1, 8个B2 , 2个A2, 24个C11, 30个C12.
我自己设计的程序是分层计算.但相同的产品不会汇总:
第一层: 2个B1, 2个B2 和 2个A2
第二层: 在B1下面是6个C11 和 6个C12; A2下面是: 6个B1 和6个C12
第三层: 在B1 下面是18个C11, 和18个C12.
怎么样才能让我的程序汇总出A 是由2个B1, 8个B2 , 2个A2, 24个C11, 30个C12 构成的呢? 或者根本就不需要分成计算?? 如果是我,只能用SQL的子查询实现,Excel的实际应用我不太会。
看看有没有其他人能帮上忙,另外能否透露一下课名,这样大致有个方向。 :) 谢谢楼主的回帖! 我的课名是 Access 数据库的应用. 这里没有涉及到Excel. 请问楼主的"用SQL的子查询实现"能否具体点? 谢谢 比如 select colum1 from table1 where colum2 in (select colum2 from table2 where colum3 = ‘xxx’); 谢谢答复. 也许是我没有真的明白你的意思. 但是我觉得版主的主意好像很难实现.
因为我的产品构成表分10层, 而且有可能同一个构成部件不只在2层出现,有可能3层,4层甚至9层都有. 每层具有N多个不同或者相同的部件产品. 根据排列组合的道理 这里的重复的部件产品已经接近无穷多. 如果用select语句一个个写出有可能重复的情况, 好像已经接近不可能了.
我的愚蠢的原Select代码如下,希望各位好友能指点, 哪怕是批评, 建议也好. 谢谢
SELECT costitemQry.productname, costitemQry.productmenge, costitemQry.description, IIf(costitemQry! Is Null,Null,1) AS 1, costitemQry., costitemQry., * AS sum1, costitemQry., IIf(costitemQry! Is Null,Null,2) AS 2, costitemQry., costitemQry., * AS sum2, costitemQry., IIf(costitemQry! Is Null,Null,3) AS 3, costitemQry., costitemQry., * AS sum3, costitemQry., IIf(costitemQry! Is Null,Null,4) AS 4, costitemQry., costitemQry., * AS sum4, costitemQry., IIf(costitemQry! Is Null,Null,5) AS 5, costitemQry., costitemQry., * AS sum5, costitemQry., IIf(costitemQry! Is Null,Null,6) AS 6, costitemQry., costitemQry., * AS sum6, costitemQry., IIf(costitemQry! Is Null,Null,7) AS 7, costitemQry., costitemQry., * AS sum7, costitemQry., IIf(costitemQry! Is Null,Null,8) AS 8, costitemQry., costitemQry., * AS sum8, costitemQry., IIf(costitemQry! Is Null,Null,9) AS 9, costitemQry., costitemQry., * AS sum9, costitemQry., IIf(costitemQry! Is Null,Null,10) AS 10, costitemQry., costitemQry., * AS sum10, costitemQry.
FROM costitemQry
ORDER BY costitemQry.productname, costitemQry., costitemQry., costitemQry., costitemQry., costitemQry., costitemQry., costitemQry., costitemQry., costitemQry., costitemQry.;
$考虑$ 你说的十层是指10个表么? :) 10层是指有层次关系的产品构成. 比如如上面的Structure图: A产品由B1, B2 和 A2构成, 其中的B1, B2 和 A2就是第一层. B1下面的C11,C12就是第二层.
所有的产品基本上只放在一个表里面. 通过查询来实现它的功能.
我的Email: joed968@yahoo.com
05111325379
谢谢了 能否把表结构放上来瞧瞧? 不过偶不是学Info的,说不定其他学Info的学生不需要也能作出来,就当是把你顶了。 :) 很乐意把我做的丑东东传上来,但是好像回帖时是传不少附件的呢. 我试着做了一下,并在MySQL上测试,可以得出结果,但是有两个小问题:
1。楼主提供的答案:“2个B1, 8个B2”是不是弄反了?应该是2个B2, 8个B1吧。
2。题目有没有给定条件,说明A类只包括A1,A2两种,B类只包括B1,B2两种,C类也只包括两种,依此类推一直到第10层?如果没有提供这样的条件,这道题将必须通过编程实现,也就是说要不停的做深度探测,比如如下情况理路上都是可以发生的:A1下有A2,A2下有A3。。。An下才有一个B1;这样是无法手动通过SQL实现查询的。
我是假设题目给定条件,每个字幕只有两种类型,也就是说如楼主例子中的情况,只有X1和X2。
建表结构:
A表:
+------+------+
| name | link |
+------+------+
| A1 | B1 |
| A1 | B1 |
| A1 | B2 |
| A1 | B2 |
| A1 | A2 |
| A1 | A2 |
| A2 | B1 |
| A2 | B1 |
| A2 | B1 |
| A2 | C12|
| A2 | C12|
| A2 | C12|
| | |
+------+------+
B表:
+------+------+
| name | link |
+------+------+
| B1 | C11|
| B1 | C11|
| B1 | C11|
| B1 | C12|
| B1 | C12|
| B1 | C12|
+------+------+
查询A只需直接查询A表
查询A2:
SELECT * FROM A WHERE name="A1" AND link="A2";
查询B需要直接查询A表,以及A-A的链接
查询B1:
SELECT * FROM A WHERE name="A1" AND link="B1"
union all
SELECT A2.name, A2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name WHERE A1.name="A1" AND A2.link="B1";
查询B2:
SELECT * FROM A WHERE name="A1" AND link="B2"
union all
SELECT A2.name, A2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name WHERE A1.name="A1" AND A2.link="B2";
查询C需要直接查询A表,以及A-A,A-B表的链接,以及A-A-B,A-B-B,A-A-B-B
查询C11:
SELECT * FROM A WHERE name="A1" AND link="C11"
union all
SELECT A2.name, A2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name WHERE A1.name="A1" AND A2.link="C11"
union all
SELECT A.name, B.link FROM A INNER JOIN B ON A.link=B.name WHERE A.name="A1" AND B.link="C11"
union all
SELECT A1.name, B.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name INNER JOIN B ON A2.link=B.name WHERE A1.name="A1" AND B.link="C11"
union all
SELECT A.name, B2.link FROM A INNER JOIN B AS B1 ON A.link=B1.name INNER JOIN B AS B2 ON B1.link=B2.name WHERE A.name="A1" AND B2.link="C11"
union all
SELECT A1.name, B2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name INNER JOIN B AS B1 ON A2.link=B1.name INNER JOIN B AS B2 ON B1.link=B2.name WHERE A1.name="A1" AND B2.link="C11";
查询C12:
SELECT * FROM A WHERE name="A1" AND link="C12"
union all
SELECT A2.name, A2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name WHERE A1.name="A1" AND A2.link="C12"
union all
SELECT A.name, B.link FROM A INNER JOIN B ON A.link=B.name WHERE A.name="A1" AND B.link="C12"
union all
SELECT A1.name, B.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name INNER JOIN B ON A2.link=B.name WHERE A1.name="A1" AND B.link="C12"
union all
SELECT A.name, B2.link FROM A INNER JOIN B AS B1 ON A.link=B1.name INNER JOIN B AS B2 ON B1.link=B2.name WHERE A.name="A1" AND B2.link="C12"
union all
SELECT A1.name, B2.link FROM A AS A1 INNER JOIN A AS A2 ON A1.link=A2.name INNER JOIN B AS B1 ON A2.link=B1.name INNER JOIN B AS B2 ON B1.link=B2.name WHERE A1.name="A1" AND B2.link="C12";