Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左外联接的错误行为?_Sql_Sql Server_Left Join - Fatal编程技术网

Sql 左外联接的错误行为?

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.

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.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;