2017-09-05 22 views
-1

次の処理を実行しようとしています。3つのテーブルを結合しているときに、Mgt.Dbo.Tab1(157行)のすべての行を表示します。この照会は、Mgtからの76行の結果のみを提供します。私は無駄に左の結合を使用してみました。助けて! TIAjoinステートメントでレコードが表示されない問題

コード:あなたの編集後

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 
+1

私はいくつかの別名を購入したいと思います。 – SqlZim

+0

@SqlZim ;-)名前はDragnetのようなものではなく、無実の – BIGTONE559

+1

を保護するために変更されています。テーブルのエイリアスと同じように、ソーステーブルの列にプレフィックスを付けます。 [テーブルのエイリアスを作成する方法 - Aaron Bertrand](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-table-aliases-like-abc-or -t1-t2-t3.aspx)。各列には、元のテーブルのテーブルエイリアスが前置されていなければなりません。つまり、クエリを左結合で修正する方法と、条件を 'where'から結合条件に移動する方法を教えてください。 – SqlZim

答えて

0

left joinのためのあなたのinner join 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' 
+0

が表示され、14108件のレコードが表示されます。左結合を追加すると、表示されるレコードの最大量はmgtの最大行になりますか? – BIGTONE559

+0

@ BIGTONE559 'mgt'の各行が結合の複数の行と一致しているので、いくつかの結合基準が欠けていると言えます。おそらく 'jnl'には' emp_num'のようにもう1つの列がありますか? – SqlZim

+0

問題は私のjoinステートメントでは間違いありません。もう少し宿題をやってみると、私は何を見つけるのか教えてくれるでしょう。 – BIGTONE559

0

それは次のように表示されますトリックをしました:

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' 

私は内部結合が欠けていました。

関連する問題