在很多帮助下,我得到了所有未使用过的材料:
SELECT DISTINCT(Materials.Material_Name) AS Unused_materials FROM Materials
LEFT JOIN Table2 ON Table2.Material_Number = Materials.Material_Number
LEFT JOIN Table1 ON Table1.Procedure_Name = Table2.Procedure_Name
WHERE Table1.Procedure_Name IS NULL
更新: 如果我可以在同一篇文章中再问一个问题。也许有人会知道如何获得上述信息,就在通缉日。喜欢:2012-11-20未使用的材料?
答案 0 :(得分:3)
在表1和表2中加入它只会为您提供已用材料的行。您要做的是选择所有未使用过的材料。为此,只需使用带有子查询的NOT IN构造:
SELECT Material_Name AS Unused_materials
FROM Materials
WHERE Materials.Material_Number
NOT IN (SELECT Material_Number FROM Table2)
更新:现在,我了解了数据模型(只想要在表1中列出的过程中未使用的材料),如果使用NOT IN构造,则使用正确的查询查询:
SELECT Material_Name AS Unused_materials
FROM Materials
WHERE Materials.Material_Number
NOT IN (SELECT Material_Number FROM Table2
INNER JOIN Table1
ON Table1.Procedure_Name = Table2.Procedure_Name)
答案 1 :(得分:2)
编辑: 忽略这个解决方案。为了进行全面讨论,我将其搁置。或者通常习惯上删除这个答案?
根据David Fleeman的解决方案进行评论后,我做了一些分析,简短的回答是:使用NOT IN与David Fleemans解决方案一起使用。它会比左连接解决方案更快。
使用David Fleemans解决方案
原帖 除了使用该查询的空结果集之外,您永远不会得到任何东西的原因是您正在选择material_name并指定material_name应为null ...
所有使用过的材料都有表2中的条目。所有未使用的材料都缺少此类条目。因此,从Materials中选择,使用Table2左连接并添加过程名为null的条件。
SELECT Material_Name
FROM Materials M
LEFT JOIN Table2 T ON M.Material_Number = T.Material_Number
WHERE Procedure_Name IS NULL
答案 2 :(得分:0)
上面的Johan几乎拥有它(未使用的材料仍然存在于table_2中,因为Table2只是对一个Material_Number的一个Procedure_Name的查找(如果它是一个1:1的关系似乎是一个愚蠢的添加)。仍然需要加入对Table1到得到空值。
所以
SELECT *
FROM Materials c
LEFT JOIN Table2 b ON b.Material_Number = c.Material_Number
LEFT JOIN Table1 a ON a.Procedure_Name = b.Procedure_Name
WHERE a.Procedure_Name is null;
重复比较的所有命令:
create table Table1 (Procedure_Name char, date date);
create table Table2 (Procedure_Name char, Material_Number int);
create table Materials (Material_Name varchar(12), Material_Number int);
insert into Table1 values ('A', '2012-11-22');
insert into Table1 values ('B', '2012-11-21');
insert into Table1 values ('C', '2012-11-20');
insert into Table2 values ('A', '101');
insert into Table2 values ('B', '102');
insert into Table2 values ('C', '103');
insert into Table2 values ('D', '104');
insert into Table2 values ('E', '105');
insert into Materials values ('Iron', 101);
insert into Materials values ('Steel', 102);
insert into Materials values ('Wood', 103);
insert into Materials values ('Glass', 104);
insert into Materials values ('Sand', 105);
-- johan query
SELECT Material_Name
FROM Materials M
LEFT JOIN Table2 T ON M.Material_Number = T.Material_Number
WHERE Procedure_Name IS NULL;
-- my query
select Material_Name
from Materials c
left join Table2 b on b.Material_Number = c.Material_Number
left join Table1 a on a.Procedure_Name = b.Procedure_name
where a.Procedure_Name is null;