使用Oracle SQL作为匹配引擎

Ern*_*roy 6 sql oracle iteration mathematical-optimization

我不确定我能找到什么是可能的,但它的思考肯定很有意思.我的目标是优化仓库的布局,但此问题适用于其他方案.

我有一个位置列表,到门的距离和它们所在的区域(例如区域A =冷藏,区域B =环境):

Location    Zone    Distance
A1          A       1
A2          A       3
A3          A       5
A4          A       7
B1          B       2
B2          B       4
B3          B       6
B4          B       8

我还有一个产品清单,它们被挑选的次数和区域(区域A =需要冷藏的产品,区域B =需要冷藏的产品,区域A/B =没有限制的产品)

Product     Zone    Pick per day
Milk        A       8
Lettuce     A/B     7
Bread       B       6
Chocolate   B       5
Tomatoes    A/B     4
Dry Pasta   B       3
Beef        A       2
Chicken     A       1

如果我只对优化选择产品的距离感兴趣,我会把最挑选的最接近门.我通过他们的ROW_NUMBER和ORDER BY Distance和Pick加入两个表来完成这个.

但是,我真的非常关心产品区域,因为我不能将面包存放在冷藏区域(它可能会变得潮湿).此外,我知道生菜可以存放在冷藏或非冷藏区域.

此外,应该有条件确保所有产品都分配一个空间(8个空格8个产品)

手动完成我会得到.

       
Location    Zone    Distance    Product     Zone    Pick per day
A1          A       1           Milk        A       8
B1          B       2           Lettuce     A/B     7
A2          A       3           Tomatoes    A/B     4
B2          B       4           Bread       B       6
A3          A       5           Beef        A       2
B3          B       6           Chocolate   B       5
A4          A       7           Chicken     A       1
B4          B       8           Dry Pasta   B       3

我看过SQL模式匹配但是没有成功.此外,我编写了一个迭代VBA函数,该函数在区域中使用"保留"空间,但这对于家用PC来说是慢的.

最后,谢谢!我一直在阅读stackoverflow中的所有问题,但这个我无法解决!

Gam*_*tic 2

A。从这个sql开始:

select * from product p left outer join location l on (INSTR(p.zone, l.zone)>0) order by p.pickperday desc, l.distance asc;

b. 编写一个存储过程,您可以在其中

  1. 创建一个哈希集
  2. 在结果集上开始循环
  3. 获取当前元素,如果它在哈希集中尚未准备好并且位置在哈希集中也未准备好,则将其插入哈希集中
  4. 返回哈希集列表

如何编写此类程序:http://docs.oracle.com/cd/B28359_01/java.111/b31225/cheight.htm#CHDCDHJD

供测试用:

CREATE TABLE "PRODUCT" (    "PRODUCT" VARCHAR2(20), "ZONE" VARCHAR2(20), "PICKPERDAY" VARCHAR2(20));
CREATE TABLE "LOCATION" (   "LOCATION" VARCHAR2(20), "ZONE" VARCHAR2(20), "DISTANCE" VARCHAR2(20));

Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A1','A','1');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B1','B','2');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A3','A','5');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B2','B','4');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A2','A','3');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B3','B','6');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B4','B','8');
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A4','B','2');

Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Milk','A','8');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Tomatos','A/B','4');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Bread','B','6');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Dry Pasta','B','3');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Lettuce','A/B','7');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Beef','A','2');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Chocolate','B','5');
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Chicken','A','1');
Run Code Online (Sandbox Code Playgroud)