左外连接的行为错误?

时间:2014-08-11 11:39:19

标签: sql sql-server left-join

SQL小提琴:http://sqlfiddle.com/#!2/49db7/2

create table EmpDetails
(
emp_code int,
e_type     varchar(10)
);

insert into EmpDetails values (100,'A');
insert into EmpDetails values (101,'D');
insert into EmpDetails values (102,'A');
insert into EmpDetails values (103,'D');

create table QDetails
(
id  int,
emp_code int,
dn_num int
);

insert into QDetails values (1,100,NULL);
insert into QDetails values (2,101,4343);
insert into QDetails values (3,101,4343);
insert into QDetails values (4,103,NULL);
insert into QDetails values (5,103,NULL);
insert into QDetails values (6,100,NULL);

select * from EmpDetails
select * from QDetails

- 预期结果

1   100 NULL
6   100 NULL
2   101 4343
3   101 4343

- 当e_type = A时,它应包括来自QDetails的行并不重要dn_num为null或不为null - 但是当e_type = D时,那么从QDetails开始,它应该只包含NOT NULL值,应该忽略null

select e.emp_code, e.e_type, q.dn_num from empdetails e left join qdetails q
on e.emp_code = q.emp_code and (e.e_type = 'D' and q.dn_num is not null)

- 上面的查询我尝试包含103 D NULL,我不需要,并且排除了我需要的6 100 NULL。

5 个答案:

答案 0 :(得分:1)

您的问题是q.dn_num is not null条件,它会明确排除您声明所需的记录。删除它应该修复它。

select e.emp_code, e.e_type, q.dn_num 
from empdetails e 
left join qdetails q
   on e.emp_code = q.emp_code 
WHERE (e.e_type = 'D' and q.db_num is not null)
OR e.e_type = 'A'

此外,一般惯例是使用您的连接仅指定连接条件和要过滤的where子句(有些原因可能不希望这样做,但取决于您的查询)。

如上所述编写查询可能会使以后更容易阅读。

答案 1 :(得分:1)

我不确定你为什么在这里使用左连接。
您可以获得使用内部联接

指定的结果
select
  e.emp_code
  ,e.e_type
  ,q.dn_num 
from 
  empdetails e 
  inner join qdetails q on e.emp_code = q.emp_code
where 
  e.e_type = 'A'
  or (e.e_type = 'D' and q.dn_num is not null)
order by
  e.emp_code
  ,e.e_type

如果你还想在empdetails表中列出qdetails中没有匹配的记录,那么将使用左连接

答案 2 :(得分:0)

SELECT     e.emp_code, 
           e.e_type,  
           q.dn_num 
FROM       empdetails e 
           LEFT JOIN  qdetails q
               ON e.emp_code = q.emp_code 
WHERE      (
               e.e_type = 'A' OR 
              (
                 e.e_type = 'D' AND
                  q.dn_num is not null
              )
           ) AND q.id is not null 

<强> SQL Fiddle Demo

答案 3 :(得分:0)

您需要正确实施逻辑。您的条件提到'A',但这不符合条件。

然后,您不需要left join。你不想要emp_code = 102。这没有匹配,所以可能会失败。

以下似乎实现了逻辑:

select e.emp_code, e.e_type, q.dn_num , q.id
from empdetails e join
     qdetails q
     on e.emp_code = q.emp_code
where (e.e_type = 'D' and q.dn_num is not null) or
      e.e_type = 'A';

答案 4 :(得分:0)

这是正确的查询。

        select q.id,e.emp_code,q.dn_num 
        from empdetails e join qdetails q
        on e.emp_code = q.emp_code
        where (e.e_type = 'D' and q.dn_num is not null)  or  e.e_type = 'A'  order by e.e_type;