在MySQL中使用1个键查询2个以上的表?

在MySQL中使用1个键查询2个以上的表?,mysql,sql,Mysql,Sql,我们有三张桌子 1)产品表 Product_ID Product_Name 2)仓库1\u表 Product_ID Inventory1 3)仓库2\u表 Product_ID Inventory2 产品ID可能不存在于Warehouse1_表或Warehouse2_表或两者中 我试图找出一个查询,它会给我们提供如下信息: Product_ID, Product_Name, TotalStock 如果产品ID在两个表中,则TotalStock为Inventory1+Inventory2

我们有三张桌子

1)产品表

Product_ID
Product_Name
2)仓库1\u表

Product_ID
Inventory1
3)仓库2\u表

Product_ID
Inventory2

产品ID可能不存在于Warehouse1_表或Warehouse2_表或两者中

我试图找出一个查询,它会给我们提供如下信息:

Product_ID, Product_Name, TotalStock
如果产品ID在两个表中,则TotalStock为Inventory1+Inventory2
如果产品ID在仓库1表格中,则TotalStock为Inventory1
如果产品ID在仓库2表格中,则TotalStock为Inventory2

如果产品ID不在任何仓库表中,则TotalStock为0。请尝试使用左联接,如果交叉表未生成匹配项,则该联接不会中断查询。然后汇总存货,如下所示:

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”字段,其中包含合并的库存或其中一个仓库返回的库存。

尝试使用左联接,如果交叉表不生成匹配项,该联接不会中断查询。然后汇总存货,如下所示:

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”字段,其中包含合并库存或其中一个仓库返回的库存。

类似的内容可能会起作用。我添加了一些示例数据来说明我的观点:

 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;
感谢DEM的鹰眼指出,避免Warehouse1_表或Warehouse1_表中相同产品_ID的多行重复非常重要。如果无法在上述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;

像这样的东西可能有用。我添加了一些示例数据来说明我的观点:

 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;
感谢DEM的鹰眼指出,避免Warehouse1_表或Warehouse1_表中相同产品_ID的多行重复非常重要。如果无法在上述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;
我还没有测试过,但这就是我的想法

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
                             );

我还没有测试过,但这就是我的想法。

NULL+3=NULL
=>你需要
IFNULL(w1.Inventory1,0)+ISNULL(w2.Inventory2,0)
这假设每个仓库表中的产品id是唯一的(OP暗示了这一点,但没有说明)。+1
NULL+3=NULL
=>你需要
IFNULL(w1.Inventory1,0)+ISNULL(w2.Inventory2,0)
这假设每个仓库表中的产品id是唯一的(OP暗示了这一点,但没有说明)。+1使用IFNULL来处理另一个表中不存在记录的情况。并将它们组合到单个字段中。但是……您使用的是SUM(),那么,如果仓库表中有相同的产品ID,您是否预计会有多个条目?如果是这样,以这种方式加入将导致重复。(w1中有2条记录,w2中有3条记录=>加入后的3条记录)@DEM-这一点很好。我想最好是删除总和,并对
Warehouse1_表
Warehouse2_表
上的Product_ID列强制执行唯一约束。我将编辑我的答案以反映这一点。使用IFNULL处理另一个表中不存在任何记录的情况。并将它们合并到单个字段中。但是…您使用的是SUM(),那么如果仓库表中的产品ID相同,您是否预期会有多个条目?如果是,以这种方式左键连接将导致重复。(w1中的2条记录,w2中的3条记录=>连接后的3条记录)@DEM-很好的观点。我想更好的方法是删除总和,并对
Warehouse1_表
Warehouse2_表
上的Product_ID列强制执行唯一约束。我将编辑我的答案以反映这一点。不处理warehouse表中没有记录的问题(提供NULL,需要0)。不会将结果合并到单个总计列中。使用SUM表示相信product_id在仓库表中不是唯一的,但如果这是真的,则左联接将创建重复(w1中有2条记录,w2中有3条记录=>左联接后有6条记录。)很好的评论。但是我看不到你的答案,所以我们都可以学习一些东西。不处理仓库表中没有记录的问题(提供NULL,需要0)。不会将结果合并到一个合计列中。使用SUM表示相信product_id在仓库表中不是唯一的,但如果这是真的,则左连接将创建重复(w1中有2条记录,w2中有3条记录=>左连接后有6条记录)。评论很好。但是我看不到您的答案,因此我们都可以学习一些东西。
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
                             );