いくつかの個別の選択クエリを統合する SQL ビューを作成しようとしています。個々の select ステートメントの句をデータベース ビューに配置する際に問題が発生しました。
私の見解の単純化されたバージョンは次のとおりです。
create or replace view TestView as
select
A.Name,
B.Subscription,
C.Expiry
from
TestTableA as A left outer join TestTableB as B on A.ID = B.A_ID
left outer join TestTableC as C on A.ID = C.A_ID;
ビューには2つの問題があります。
最初の結合では、サブスクリプションが特定の値であるレコードのみを選択し、その値でない場合でも名前と有効期限の列を取得するにはどうすればよいですか (この場合、サブスクリプションは null になります)。
2 番目の参加で、最新の有効期限のレコードのみが必要であると指定するにはどうすればよいですか?
以下は、私のテスト スキーマ、サンプル データ、および目的の結果セットです。
create table TestTableA
(
ID int,
Name varchar(32),
Primary Key(ID)
);
create table TestTableB
(
ID int,
A_ID int,
Subscription varchar(32),
Primary Key(ID),
Foreign Key(A_ID) references TestTableA(ID)
);
create table TestTableC
(
ID int,
A_ID int,
Expiry date,
Primary Key(ID),
Foreign Key(A_ID) references TestTableA(ID)
);
create or replace view TestView as
select
A.Name,
B.Subscription,
C.Expiry
from
TestTableA as A left outer join TestTableB as B on A.ID = B.A_ID
left outer join TestTableC as C on A.ID = C.A_ID;
insert into TestTableA values (1, 'Joe');
insert into TestTableB values (1, 1, 'abcd');
insert into TestTableB values (2, 1, 'efgh');
insert into TestTableC values (1, 1, '2012-10-25');
insert into TestTableC values (2, 1, '2012-10-24');
insert into TestTableA values (2, 'Jane');
望ましい結果 1:
select * from TestView where Subscription is null or Subscription = 'efgh';
Joe, efgh, 2012-10-25
Jane, ,
望ましい結果 2:
select * from TestView where Subscription is null or Subscription = 'xxxx';
Joe, , 2012-10-25
Jane, ,