2017-06-16 56 views
0

我有三个表的文章,库存和仓库。甲骨文,加入特殊要求

CREATE TABLE "ARTICLE" 
( "ID" NUMBER(9,0), 
    "NAME" VARCHAR2(30 BYTE) 
) 

CREATE TABLE "INVENTORY" 
( "ID" NUMBER(9,0), 
    "ARTICLE_ID" NUMBER(9,0), 
    "QUANTITY" NUMBER(9,0), 
    "WAREHOUSE_ID" NUMBER(9,0) 
) 

CREATE TABLE "WAREHOUSE" 
( "ID" NUMBER(9,0), 
    "NAME" VARCHAR2(30 BYTE) 
) 

我创建了一个观点,我显示了所有库存(含项目名称等)

CREATE VIEW "INVENTORY_VIEW" AS 
a.ID AS A_ID, 
a.NAME AS A_NAME, 
i.ID AS I_ID, 
i.QUANTITY AS I_QUANTITY, 
i.WAREHOUSE_ID AS I_WAREHOUSE_ID 
FROM 
ARTICLE a 
LEFT OUTER JOIN INVENTORY i ON i.ARTICLE_ID = a.ID 

我这样做是为了确保,我得到一个排的每个项目,即使有库存中没有行。 (I_WAREHOUSE_ID是在特殊情况下空) 这工作,除了一个案例精:

只要有库存一行当然另一个仓库行(与I_WAREHOUSE_ID = NULL)在前看不见的其他仓库。 (其他仓库(例如仓库2)通过“WHERE I_WAREHOUSE_ID = 2”或“I_WAREHOUSE_ID为空”来选择库存。)

任何人的想法如何解决这个问题? 如果本文和仓库没有任何iventory行,我需要的是每个WAREHOUSE_ID(带ID)的文章行。 我的想法是创建所有文章/仓库组合的第二个视图,然后与清单加入该表,但我没有成功。

+1

如果您正在过滤'warehouse_id = 2',您为什么要包含那些不在该仓库库存中的物品? – APC

+0

物品表适用于两个仓库。如果没有可用的库存行,我想至少显示一行没有库存。 – Sebastian

回答

2

如果我理解正确,您希望每个文章和仓库有一个结果行。因此,交叉连接两个表和外部联接库存则:

CREATE VIEW inventory_view AS 
SELECT 
    a.id AS article_id, 
    a.name AS article_name, 
    i.id AS inventory_id, 
    i.quantity AS inventory_quantity, 
    w.id AS warehouse_id 
FROM ARTICLE a 
CORSS JOIN WAREHOUSE w 
LEFT OUTER JOIN inventory i ON i.article_id = a.id AND i.warehouse_id = w.id; 
0

如果我理解正确的话你问(请在下一次后以表格的文字预期的结果),你可以试试下面的查询:

SELECT 
A.ID AS A_ID, 
A.NAME AS A_NAME, 
I.ID AS I_ID, 
I.QUANTITY AS I_QUANTITY, 
I.WAREHOUSE_ID AS I_WAREHOUSE_ID 
, W2.NAME 
, W2.ID 
FROM ARTICLE A 
LEFT JOIN INVENTORY I ON I.ARTICLE_ID = A.ID 
CROSS JOIN WAREHOUSE W2 
WHERE I.WAREHOUSE_ID IS NULL OR (W2.ID IS NOT NULL AND I.WAREHOUSE_ID=W2.ID); 

样本数据:

INSERT INTO ARTICLE VALUES (1,'PROD_A'); 
INSERT INTO ARTICLE VALUES (2,'PROD_B'); 
INSERT INTO INVENTORY VALUES (1, 1,10,2); 
INSERT INTO "WAREHOUSE" VALUES (1,'WA'); 
INSERT INTO "WAREHOUSE" VALUES (2,'WB'); 

输出:

+------+--------+------+------------+----------------+------+----+ 
| A_ID | A_NAME | I_ID | I_QUANTITY | I_WAREHOUSE_ID | NAME | ID | 
+------+--------+------+------------+----------------+------+----+ 
| 1 | PROD_A | 1 | 10   | 2    | WB | 2 | 
| 2 | PROD_B | NULL | NULL  | NULL   | WA | 1 | 
| 2 | PROD_B | NULL | NULL  | NULL   | WB | 2 | 
+------+--------+------+------------+----------------+------+----+ 
+0

谢谢。对不起,没有发布结果表。在这种情况下,缺少一行。我还希望带有Warehouse WA(ID 1)的ArticleId 1(Prod_A)行。 – Sebastian

+0

您可以更改WHERE条件,或参阅Thorsten答案 – etsa