web-dev-qa-db-ja.com

結合されたテーブルのSQLエイリアス

私はこのようなクエリを持っています:

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
7
Lincecum
SELECT a1.Name, b1.Info
FROM table2 b1
    JOIN table2 a1 ON b1.id= a1.id AND a1.status = 1

右外部結合は、テーブルだけを切り替えて、左外部結合とまったく同じことを行います。結合をフィルタリングしても、初期テーブルのデータが含まれます。

13
Dustin Laine

次のように、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)
2
Samuel Neff
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関数を使用する必要があります。これにより、基本的にサブセットがより大きなものから除外されます。データセット。

0
JNK