2011-12-15 110 views
0

我們有三張桌子。在MySQL中查詢多於2個包含1個鍵的表?

1) Product_Table

Product_ID 
Product_Name 

2) Warehouse1_Table

Product_ID 
Inventory1 

3) Warehouse2_Table

Product_ID 
Inventory2 


產品ID可能不在Warehouse1_Table或Warehouse2_Table中,或者兩者都存在

我試圖找出一個查詢這給了我們這樣的:

Product_ID, Product_Name, TotalStock 

TotalStock是Inventory1 + Inventory2如果PRODUCT_ID既是表所示。
TotalStock是Inventory1如果PRODUCT_ID是Warehouse1_Table
TotalStock是Inventory2如果PRODUCT_ID是Warehouse2_Table
TotalStock是0,如果PRODUCT_ID沒有任何倉庫表

回答

1

嘗試使用LEFT JOIN,這是一個加入該沒有按」如果你的交叉表沒有產生匹配,那麼不會打斷你的查詢。再總結的庫存,像這樣:

SELECT p.Product_ID, p.Product_Name, 
(IFNULL(w1.Inventory1, 0) + ISNULL(w2.Inventory2, 0)) AS TotalStock 
FROM `Product_Table` AS p 
LEFT JOIN `Warehouse1_Table` AS w1 ON (
    p.Product_ID = w1.Product_ID 
) LEFT JOIN `Warehouse2_Table` AS w2 ON (
    p.Product_ID = w2.Product_ID 
); 

那麼你的結果集應包含兩種組合股票或倉庫的任何一個返回的股票「TotalStock」字段。

+1

`NULL + 3 = NULL` =>你需要'IFNULL(w1.Inventory1,0)+ ISNULL(w2.Inventory2,0)` – MatBailie 2011-12-15 08:38:21

+0

@Dems你是對的,更新的例子。謝謝。 – Oldskool 2011-12-15 08:40:13

+0

這假定每個倉庫表中的product_id都是唯一的(這是OP所暗示的,但未說明)。+1 – MatBailie 2011-12-15 08:44:42

2

這樣的事情可能會奏效。我已經添加了一些樣本數據來說明什麼,我在得到:

create table Product_table 
(Product_ID int unsigned primary key,Product_Name varchar(50) not null, 
UNIQUE KEY `Product_TableUIdx1` (Product_Name)); 

create table Warehouse1_Table 
(Product_ID int unsigned not null,Inventory1 int, 
UNIQUE KEY `Warehouse1_Table_UIdx1` (Product_Id)); 

create table Warehouse2_Table 
(Product_ID int unsigned,Inventory2 int, 
UNIQUE KEY `Warehouse2_Table_UIdx1` (Product_Id)); 

insert into Product_table values (1,"Banana"); 
insert into Product_table values (2,"Apple"); 
insert into Product_table values (3,"Pear"); 
insert into Product_table values (4,"Orange"); 

insert into Warehouse1_Table values (1,2); 

insert into Warehouse2_Table values (3,10); 
insert into Warehouse2_Table values (4,5); 
insert into Warehouse2_Table values (1,3); 

select pt.Product_ID,pt.Product_Name, 
ifnull(wt1.Inventory1,0)+ifnull(wt2.Inventory2,0) as StockTotal 
from Product_table pt 
left outer join Warehouse1_Table wt1 on wt1.Product_ID = pt.Product_ID 
left outer join Warehouse2_Table wt2 on wt2.Product_ID = pt.Product_ID; 

由於民主黨的鷹的眼睛指出,重要的是避免在同一PRODUCT_ID多行所產生的重複是很重要的兩種Warehouse1_Table或Warehouse1_Table。如果添加唯一鍵在上面DDL是不可能的,那麼你可以解決使用(有點醜陋)這樣的查詢:

select pt.Product_ID,pt.Product_Name, 
ifnull(wt1.Inventory1Total,0)+ifnull(wt2.Inventory2Total,0) as StockTotal 
from Product_table pt 
left outer join (select w1.Product_ID,sum(w1.Inventory1) as Inventory1Total 
from Warehouse1_Table w1 group by w1.Product_ID) as wt1 on wt1.Product_ID = pt.Product_ID 
left outer join (select w2.Product_ID,sum(w2.Inventory2) as Inventory2Total 
from Warehouse2_Table w2 group by w2.Product_ID) as wt2 on wt2.Product_ID = pt.Product_ID; 
0
SELECT Product_ID, 
     Product_Name, 
     SUM(w1.Inventory1) as sum1, 
     SUM(w2.Inventroy2) as sum2   

FROM Product_Table p 
LEFT JOIN Warehouse1_Table w1 ON p.Product_ID = w1.Product_ID 
LEFT JOIN Warehouse2_Table w2 ON p.Product_ID = w2.Product_ID 
GROUP BY p.Product_ID 

我沒有測試過,但是這就是這個想法。

0
SELECT Product_ID, Product_Name, 
     Inventory1 + Inventory2 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse1_Table 
     NATURAL JOIN Warehouse2_Table 
UNION 
SELECT Product_ID, Product_Name, 
     Inventory1 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse1_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse2_Table 
         ) 
UNION 
SELECT Product_ID, Product_Name, 
     Inventory2 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse2_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse1_Table 
         ) 
UNION 
SELECT Product_ID, Product_Name, 
     0 AS TotalStock 
    FROM Product_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse1_Table 
         ) 
     AND Product_ID NOT IN (
           SELECT Product_ID 
           FROM Warehouse2_Table 
          );