2011-12-15 22 views
0

3つのテーブルがあります。MySQLで1つのキーで2つ以上のテーブルをクエリしますか?

1) Product_Table

Product_ID 
Product_Name 

2) Warehouse1_Table

Product_ID 
Inventory1 

3) Warehouse2_Table

Product_ID 
Inventory2 


Product IDは、Warehouse1_TableまたはWarehouse2_Tableまたは両方ともに存在しない可能性があります。私は私たちにこのような何か与え単一のクエリを把握しようとしている

:PRODUCT_IDは、両方のテーブルにある場合

Product_ID, Product_Name, TotalStock 

TotalStockはInventory1 + Inventory2です。
TotalStockはPRODUCT_IDがWarehouse1_Table
である場合 TotalStockはPRODUCT_IDがWarehouse2_Table
である場合PRODUCT_IDは倉庫テーブルの任意の

答えて

1

にそれはそれは「doesnの参加だ、LEFT JOINを使用してみてくださいされていない場合 TotalStockが0であるInventory2あるInventory1ですあなたのクロステーブルが一致しない場合は、あなたの質問を破ってください。

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

+0

@Demsは、例を更新しました。ありがとう。 – Oldskool

+0

これは、product_idが各ウェアハウス表内で一意であることを前提としています(OPによって暗示されていますが、明記されていません)。+1 – MatBailie

2

このようなものが動作する可能性があります。どちらかで同じPRODUCT_IDのために複数の行から生じる重複を避けることが重要であることを指摘して民主党員のワシの目に

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; 

ありがとう:私は私が得ているものを説明するためにいくつかのサンプルデータを追加しました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; 
+1

IFNULLを使用して、それらを1つのフィールドに結合します。しかし...あなたはSUM()を使用していますので、ウェアハウステーブルの同じ製品IDの場合は複数のエントリを予測しますか?そうであれば、この方法でLEFT JOININGを行うと重複が発生します。(w1に2レコード、w2に3レコード=結合後3レコード) – MatBailie

+0

@Dems - 良い点。私は和を削除し、 'Warehouse1_Table'と' Warehouse2_Table'の両方で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

ウェアハウステーブルにレコードが存在しないことを処理しません(NULLを指定すると、0が必要です)。結果を1つの合計列に結合しません。 SUMを使用すると、product_idがウェアハウス表内で一意ではないとの考えが示されますが、それが真であればLEFT JOINは複製を作成します(左結合後w1 = 2レコード、w2 => 6レコードに2レコード)。 – MatBailie

+0

。しかし私はあなたの答えを見ることができないので、私たちはすべて何かを学ぶことができます。 – Khronos

+0

編集後、私はOldskoolの答えに投票しました。 – MatBailie

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 
          ); 
関連する問題