4

条件に一致する左側のテーブルからいくつかの情報を取得し、右側のテーブルからすべての情報を取得するSQLクエリを実行することはとにかく可能ですか?ただし、右側のテーブルの条件に一致するレコードがない場合でも、完全なレコードが表示されますが、多くの*NULL*が入力されます。

現時点では、私はこれに来ました:

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

ただし、これは、-条件に一致するuser-tableレコードがある場合のレコードのみを表示します。rapports-tableWHERE

とにかく可能ですか?

4

3 に答える 3

2

外部テーブル(r)の条件がどこにあるかに注意してください-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;
于 2012-05-02T16:38:57.100 に答える
1

はい!

変更right outer joinleft 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番目の入力に一致する行がなかった最初の入力からの行も返します。2番目の入力の一致しない行は、null値として返されます。引数列に結合述部が存在しない場合、各行は一致する行です。

これを念頭に置いて、joinは制限付きで作成されu.id = r.useridます。したがって、where制限が存在しなかった場合、結果はu.id, u.fullname, r.*すべてになりますusers

句があるためwhere、一部の行が外側に配置される可能性があります。それが不要な場合は、次のクエリを使用してください。

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
于 2012-05-02T16:27:47.903 に答える
-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
于 2014-02-03T16:26:18.933 に答える