在MySQL中使用1个键查询2个以上的表?
我们有三张桌子 1)产品表在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
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暗示了这一点,但没有说明)。+1NULL+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
);