1

いくつかの個別の選択クエリを統合する 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, , 
4

2 に答える 2

2

単純なSQLでクエリを作成しますSQLServer2005以降を使用している場合は、サブクエリで結合する代わりにを
使用できます。outer applymin()

select 
    A.Name,
    B.Subscription,
    C.Expiry
from TestTableA as A
    left outer join TestTableB as B on A.ID = B.A_ID and B.Subscription in ('abcd', 'efgh') 
    left outer join
    (
        select min(T.Expiry) as Expiry, T.A_ID
        from TestTableC as T
        group by T.A_ID
    ) as C on A.ID = C.A_ID
于 2012-10-17T05:29:52.760 に答える
0
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;
where 
  B.Subscription is not null
  and C.Expiry between (now() - interval 1 minute) and now() 
于 2012-10-17T05:31:01.360 に答える