MySQL左连接(我认为)

时间:2013-11-22 14:48:12

标签: mysql sql database

我遇到了一个问题。我有3张桌子,我加入他们但是无法得到正确的答案,如果有人能帮助我,我会很感激。所以我想要的是,答案向我展示未使用的材料。表:enter image description here

在很多帮助下,我得到了所有未使用过的材料:

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未使用的材料?

3 个答案:

答案 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;