Sql 左外联接的错误行为?
SQL Fiddle: --预期结果Sql 左外联接的错误行为?,sql,sql-server,left-join,Sql,Sql Server,Left Join,SQL Fiddle: --预期结果 1 100 NULL 6 100 NULL 2 101 4343 3 101 4343 --当e_type=A时,它应该包括来自QDetails的行,不管dn_num是否为null --但当e_type=D时,从QDetails中,它应该只包含NOTNULL值,而忽略NULL值 select e.emp_code, e.e_type, q.dn_num from empdetails e left join qdetails q on e.
1 100 NULL
6 100 NULL
2 101 4343
3 101 4343
--当e_type=A时,它应该包括来自QDetails的行,不管dn_num是否为null
--但当e_type=D时,从QDetails中,它应该只包含NOTNULL值,而忽略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。您的问题是您的
q.dn_num不是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'
此外,使用join仅指定要筛选的join条件和where子句是一种常规约定(您可能不想这样做,但这取决于您的查询)
如上所述编写查询可能会使它们更易于以后阅读
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
您需要正确实现逻辑。您的条件提到了
'A'
,但这不在条件中
这样,就不需要左连接了。您不需要emp\u 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';
我不知道你为什么在这里使用左连接。
可以获得使用内部联接指定的结果
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中不匹配的记录,则可以使用左联接。这是正确的查询
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;
它排除了一个类型,我想也包括这个类型。更新了我答案中的SQL以适应,遗漏了问题中的那个部分。
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;