私はこのようなクエリを持っています:
select a1.name, b1.info
from (select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)
A1.status = 1のすべてのもののみを含めたいのですが、外部結合を使用しているため、テーブル1にwhere
制約を追加することはできません。これは、テーブル2から除外したいすべての情報があるためです。名前がなくても、まだそこにあります。私はこのようなことを考えていました:
select z1.name, z1.info
from ((select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)) as z1
where z1.status = 1
しかし、それは合法ではないと思います。
編集:以下で説明するように、外部結合は実際には私がやろうとしていることには意味がありません。たとえば、対応するIDがtable1にまったく存在しないすべてのデータを含め、table1のstatus!= 1であるtable2のすべてのデータが必要な場合はどうなりますか。したがって、table2のすべてのデータの外部結合が必要になりますが、status = 1のエントリは除外したいと思います。
これに相当します:
select z1.name, z1.info
from ((select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)) as z1
where z1.status != 1
SELECT a1.Name, b1.Info
FROM table2 b1
JOIN table2 a1 ON b1.id= a1.id AND a1.status = 1
右外部結合は、テーブルだけを切り替えて、左外部結合とまったく同じことを行います。結合をフィルタリングしても、初期テーブルのデータが含まれます。
次のように、where
句をsubquery
に追加します。
select a1.name, b1.info from
(
select name, id
from table1 a
where a.status = 1
) as a1
right outer join
(
select id, info
from table2 b
) as b1 on (a1.id=b1.id)
select a1.name, b1.info from
(select name, id, status from table1 a WHERE status=1) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)
編集:
2番目のシナリオの場合:
select a1.name, b1.info from
(select name, id, status from table1 a) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)
EXCEPT
select a1.name, b1.info from
(select name, id, status from table1 a WHERE status<>1) as a1
right outer join
(select id, info from table2 b) as b1 on (a1.id=b1.id)
関係なくすべてのtable2データを取得するため、これは機能するはずです。
編集2:
OK、テーブル1にステータスIDがある場合を除いて、テーブル2からすべてを取得するには、テーブル1にエントリがない場合でも、EXCEPT
関数を使用する必要があります。これにより、基本的にサブセットがより大きなものから除外されます。データセット。