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