2012-05-02 19 views
4

左テーブルからいくつかの情報を取得し、条件に一致する右テーブルからすべての情報を取得するSQLクエリは、とにかく可能ですか? しかし、右の表の条件に一致するレコードが存在しない場合、それはまだ完全なレコードを示しているが、現時点では* NULL * sの右テーブル内で一致しないSQL右外部結合

の多くで満たされなければならない、私はこれに来ています

select 
u.id, u.fullname, 
r.* 
from 
users as u 
right outer join 
rapports as r 
on 
u.id = r.userid 
where 
u.active = 1 
and (r.closed = 0 or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112)) 
order by 
u.fullname 

しかし、に一致するレコードがrapports-tableにある場合は、user-tableのレコードしか表示されません。

これはどうしてですか?

+0

あなたは左からテーブル(最初の)テーブルをしたい場合は、LEFT外部結合を使用する必要があります。論理的に考えるのは非常に直感的ではないので、実際には右外部結合をほとんど見ることはほとんどありません。私見では。 –

+0

真実ですが、これでも問題は解決しません:( – Behrens

答えて

2

お知らせ - WHERE句(外部結合を内部結合に変換する)ではなく、ON句に変換します。

select 
u.id, u.fullname, 
r.* 
from 
users as u 
left outer join 
rapports as r 
on 
u.id = r.userid 
and (r.closed = 0 
    or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112)) 
where 
u.active = 1 
order by 
u.fullname; 

しかし、これははるかに優れています:

select 
u.id, u.fullname, 
r.* 
from 
users as u 
left outer join 
rapports as r 
on 
u.id = r.userid 
and (r.closed = 0 or CONVERT(DATE, r.periodstart) = CONVERT(DATE, GETDATE())) 
where 
u.active = 1 
order by 
u.fullname; 
+0

パーフェクト!ありがとう! :) – Behrens

1

はい! left outer joinによって

変更right outer join

select 
u.id, u.fullname, 
r.* 
from 
users as u 
left outer join 
rapports as r 
on 
u.id = r.userid 
where 
u.active = 1 
and (r.closed = 0 or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112)) 
order by 
u.fullname 

左外側は、論理演算子を参加が満たす 第二(下部)の入力に最初(一番上)の入力を結合する各列を返します。また、 は、2番目の入力に一致する行がない最初の入力からすべての行を返します( )。 2番目の入力の一致しない行は、ヌル値として返される です。 Argument 列に結合述部が存在しない場合、各行は一致する行です。これを考慮して

joinを制限u.id = r.useridで作られています。したがって、whereの制限が存在しない場合、結果はすべてusersu.id, u.fullname, r.*になります。

where句、あなたは、このクエリを使用することを望まない場合は、行のいくつかは、ouside置かれるかもしれないがありますので:外部表(R)のための条件が行く

select 
u.id, u.fullname, 
r.* 
from 
users as u 
left outer join 
rapports as r 
on 
u.id = r.userid and u.active = 1 
where 
and (r.closed = 0 or CONVERT(varchar, r.periodstart, 112) = convert(varchar, GETDATE(), 112)) 
order by 
u.fullname 
+0

問題は解決しません。正しい表に一致するレコードがあるレコードだけが表示されます。 – Behrens

+0

私の改訂版の回答を確認してください。何かが分からない場合は、私に教えてください。しかし、あなたの問題はどこの制限にあるのでしょうか、コードの中ではなく、左に置いたことを忘れてしまったでしょう! –

+1

'WHERE'節に' u'と 'r'の両方がある –

-1
SELECT * 
FROM #temp_table_name 

SELECT DISTINCT 
     b.NAME , 
     q.valueI 
FROM #temp_table_name q 
     RIGHT OUTER JOIN (SELECT NAME 
          FROM  (SELECT NAME , 
               valueI 
             FROM  #temp_table_name 
             INTERSECT 
             SELECT NAME , 
               valueI 
             FROM  #temp_table_name 
            ) a 
          GROUP BY a.name 
          HAVING COUNT(*) = 1 
         ) b ON q.NAME = b.NAME 
関連する問題