【问题标题】:Issues with join statement not displaying records连接语句不显示记录的问题
【发布时间】:2018-02-14 02:14:07
【问题描述】:

我正在尝试完成以下操作:显示 Mgt.Dbo.Tab1 的所有行(157 行),同时加入 3 个表。该查询仅提供来自 Mgt 的 76 行的结果。我试过使用左连接无济于事。帮助! TIA

代码:

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
  inner join Comp1.DBO.emp as emp
    on Mgt.emp_num = emp.emp_num
  inner join Comp1.dbo.hdr as hdr
    on Mgt.emp_num = hdr.emp_num
  inner join Comp1.dbo.jnl as jnl
    on jnl.c_n = hdr.c_n
where COMPANY in ('Test') 
  and jnl.wg = 'SP' 
  and mgt.d_r = jnl.d_w 
  and mgt.d_r >= '8/20/2017' 
  and mgt.d_r <= '9/1/2017'
  and mgt.d_r=jnl.d_w

【问题讨论】:

  • 我想买一些别名。
  • @SqlZim ;-) 名称已更改以保护无辜
  • 不,不像 Dragnet。像表别名和源表的前缀列。 How to alias your tables - Aaron Bertrand。每列都应为其来源表的表别名作为前缀,这样我们就可以告诉您如何使用左连接以及将条件从您的where 移动到您的连接条件来修复您的查询。
  • 哦,好的。我一直在阅读它。这对我来说是新的,所以我很抱歉。我相信它有助于提高可读性
  • 将所有这些连接更改为左连接。如果这样做不行,请关注 where 子句。关键是,您的内部连接和 where 子句将限制您在此查询中的结果集。

标签: sql sql-server-2008 select join


【解决方案1】:

编辑后,将inner joins 替换为left joins,并将左连接表上的任何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'

【讨论】:

  • 作为切换的结果,我现在显示 14108 条记录。不应该通过添加左连接,可以显示的最大记录数将是 mgt 中的最大行数?
  • @BIGTONE559 我会说您缺少一些连接条件,因为mgt 中的每一行都匹配连接中的多行。也许jnl 有另一个专栏可以加入,比如emp_num
  • 问题肯定出在我的加入声明上。做更多的功课,我会让你知道我发现了什么。
  • @BIGTONE559 祝你好运!
  • 我发现的第一个问题是,行 mgt.d_r=jnl.d_w 当包含在 join 语句中时,它会导致 jnl 表中的多个记录(多个记录与mgt.d_r)。问题是当包含在 where 子句中时,它不会显示 jnl.d_w 中同一天没有记录的 mgt.d_r 中的行;-(!
【解决方案2】:

看来下面的方法成功了:

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'

我缺少一个内部连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-09-10
    相关资源
    最近更新 更多