Sql join语句未显示记录时出现问题

Sql join语句未显示记录时出现问题,sql,sql-server-2008,select,join,Sql,Sql Server 2008,Select,Join,我试图完成以下工作:在连接3个表时显示Mgt.Dbo.Tab1的所有行(157行)。查询仅提供来自Mgt的76行的结果。我试过使用左连接,但没有用。救命啊!短暂性脑缺血发作 代码: 选择 管理UID ,Mgt.emp_num ,emp.emp_NAME ,RTRIM(管理公司) “公司1” ,jnl.d_w ,管理部 ,jnl.UNITS ,jnl.RATE ,管理时数 ,管理费率 ,rtrim(jnl.备忘录) ,mgt.UNIQUE\u ID ,jnl.grow ,jnl.grow_num

我试图完成以下工作:在连接3个表时显示Mgt.Dbo.Tab1的所有行(157行)。查询仅提供来自Mgt的76行的结果。我试过使用左连接,但没有用。救命啊!短暂性脑缺血发作

代码:

选择
管理UID
,Mgt.emp_num
,emp.emp_NAME
,RTRIM(管理公司)
“公司1”
,jnl.d_w
,管理部
,jnl.UNITS
,jnl.RATE
,管理时数
,管理费率
,rtrim(jnl.备忘录)
,mgt.UNIQUE\u ID
,jnl.grow
,jnl.grow_num
,hdr.ch_日期
,管理分包人
,hdr.ch_num
来自管理dbo.sick作为管理
内部连接Comp1.DBO.emp作为emp
在Mgt.emp_num=emp.emp_num上
内部连接Comp1.dbo.hdr作为hdr
on Mgt.emp_num=hdr.emp_num
内部连接Comp1.dbo.jnl作为jnl
关于jnl.c_n=hdr.c_n
公司所在地(“测试”)
和jnl.wg='SP'
和mgt.d_r=jnl.d_w
和管理部门>='2017年8月20日'

和mgt.d_r编辑后,将
内部联接
s替换为
左联接
s,并将左联接表上的任何
where
子句移动到联接条件:

select 
    mgt.UID
  , mgt.emp_num
  , emp.EMP_NAME
  , RTRIM(mgt.COMPANY)
  , 'Company 1'
  , jnl.d_w
  , mgt.d_r
  , jnl.UNITS
  , jnl.RATE
  , mgt.hours
  , mgt.RATE
  , rtrim(jnl.MEMO)
  , mgt.UNIQUE_ID
  , jnl.grow
  , jnl.grow_num
  , hdr.ch_date
  , mgt.sub_by
  , hdr.ch_num
from Mgt.dbo.sick as mgt
  left join Comp1.DBO.emp as emp
    on Mgt.emp_num = emp.emp_num
  left join Comp1.dbo.hdr as hdr
    on Mgt.emp_num = hdr.emp_num
  left join Comp1.dbo.jnl as jnl
    on jnl.c_n = hdr.c_n
   and jnl.wg = 'SP' 
   and jnl.d_w = mgt.d_r
where mgt.COMPANY in ('Test') 
  and mgt.d_r >= '8/20/2017' 
  and mgt.d_r <= '9/1/2017'
选择
管理UID
,mgt.emp_num
,emp.emp_NAME
,RTRIM(管理公司)
“公司1”
,jnl.d_w
,管理部
,jnl.UNITS
,jnl.RATE
,管理时数
,管理费率
,rtrim(jnl.备忘录)
,mgt.UNIQUE\u ID
,jnl.grow
,jnl.grow_num
,hdr.ch_日期
,管理分包人
,hdr.ch_num
来自管理dbo.sick作为管理
左连接Comp1.DBO.emp作为emp
在Mgt.emp_num=emp.emp_num上
左连接Comp1.dbo.hdr作为hdr
on Mgt.emp_num=hdr.emp_num
左连接Comp1.dbo.jnl作为jnl
关于jnl.c_n=hdr.c_n
和jnl.wg='SP'
和jnl.d_w=管理d_r
管理公司在哪里(“测试”)
和管理部门>='2017年8月20日'

和mgt.d_r似乎是以下因素起了作用:

select 
mgt.UID
, mgt.emp_num
, emp.EMP_NAME
, RTRIM(mgt.COMPANY)
, 'Company 1'
, jnl.d_w
, mgt.d_r
, jnl.UNITS
, jnl.RATE
, mgt.hours
, mgt.RATE
, rtrim(jnl.MEMO)
, mgt.UNIQUE_ID
, jnl.grow
, jnl.grow_num
, hdr.ch_date
, mgt.sub_by
, hdr.ch_num
from Mgt.dbo.sick as mgt
left join Comp1.DBO.jnl as jnl
        inner join comp1.dbo.hdr as hdr 
        on jnl.c_n= hdr.c_n
on jnl.d_w=mgt.d_r
and mgt.unique_id=jnl.memo
and hdr.emp_num=mgt.emp_num
where mgt.COMPANY in ('Test') 
and mgt.d_r >= '8/20/2017' 
and mgt.d_r <= '9/1/2017'
选择
管理UID
,mgt.emp_num
,emp.emp_NAME
,RTRIM(管理公司)
“公司1”
,jnl.d_w
,管理部
,jnl.UNITS
,jnl.RATE
,管理时数
,管理费率
,rtrim(jnl.备忘录)
,mgt.UNIQUE\u ID
,jnl.grow
,jnl.grow_num
,hdr.ch_日期
,管理分包人
,hdr.ch_num
来自管理dbo.sick作为管理
左连接Comp1.DBO.jnl作为jnl
内部连接comp1.dbo.hdr作为hdr
关于jnl.c_n=hdr.c_n
关于jnl.d_w=mgt.d_r
和管理唯一\u id=jnl.memo
和hdr.emp_num=mgt.emp_num
管理公司在哪里(“测试”)
和管理部门>='2017年8月20日'

还有mgt.d\r我想买一些别名。@SqlZim;-)为了保护无辜者,这些名字已经改变了,不像拉格内特。类似于表别名和源表的前缀列。每个列都应该在其来源表的表别名前加上前缀,这样我们就可以告诉您如何使用左联接修复查询,并将条件从
where
移动到联接条件。哦,好的。我一直在仔细阅读。这对我来说是新的,所以我道歉。我相信这会有助于可读性将所有这些连接更改为左连接。如果这不起作用,请关注where子句。关键是,您的内部联接和where子句将限制您在该查询中的结果集。是否应该通过添加左联接,可以显示的最大记录量将是mgt中的最大行数?@BIGTONE559我想说您缺少一些联接条件,因为
mgt
中的每一行都与联接中的多行相匹配。也许
jnl
还有另一列要连接,比如
emp_num
?问题肯定出在我的join语句上。再做一点作业,我会告诉你我发现了什么。@BIGTONE559祝你好运!我发现的第一个问题是,行mgt.d_r=jnl.d_w包含在join语句中时,它会导致jnl表中的多个记录(多个记录与mgt.d_r具有相同的日期)。问题是,当包含在where子句中时,它不会显示来自mgt.d_r的行,因为jnl.d_w中当天没有记录-(!
select 
mgt.UID
, mgt.emp_num
, emp.EMP_NAME
, RTRIM(mgt.COMPANY)
, 'Company 1'
, jnl.d_w
, mgt.d_r
, jnl.UNITS
, jnl.RATE
, mgt.hours
, mgt.RATE
, rtrim(jnl.MEMO)
, mgt.UNIQUE_ID
, jnl.grow
, jnl.grow_num
, hdr.ch_date
, mgt.sub_by
, hdr.ch_num
from Mgt.dbo.sick as mgt
left join Comp1.DBO.jnl as jnl
        inner join comp1.dbo.hdr as hdr 
        on jnl.c_n= hdr.c_n
on jnl.d_w=mgt.d_r
and mgt.unique_id=jnl.memo
and hdr.emp_num=mgt.emp_num
where mgt.COMPANY in ('Test') 
and mgt.d_r >= '8/20/2017' 
and mgt.d_r <= '9/1/2017'