4

ビュー内のWHERE句を検討するようにSQLServerを説得する方法を知っていますか?SQLServerが私のビューだけを実行しているように見えます。TOP1を評価してから「whereid=N」句を適用してビューの結果セットをフィルタリングします。例:

create table mytable ( id int, name varchar(64) );

insert into mytable values ( 5, 'BOB' );
insert into mytable values ( 5, 'ROBERT' );
insert into mytable values ( 5, 'SMITH, ROBERT' );
insert into mytable values ( 8, 'A.J.' );
insert into mytable values ( 8, 'Al J.' );
insert into mytable values ( 8, 'Albert Johnston' );

select * from mytable;

+----+-----------------+
: id : name            :
+----+-----------------+
:  5 : BOB             :
:  5 : ROBERT          :
:  5 : SMITH, ROBERT   :
:  8 : A.J.            :
:  8 : Al J.           :
:  8 : Albert Johnston :
+----+-----------------+

create view myview as
   select top 1 id, name
   from mytable
   order by len(name) desc

問題:

-- bad, empty result set
-- (I want this to answer 5, 'SMITH, ROBERT')
select * from myview where id = 5 

これらは期待どおりに機能します。

-- good, answers 8, 'Albert Johnston'
select * from myview

-- good, also answers 8, 'Albert Johnston'
select * from myview where id = 8 

今ビューなし:

-- good, answers 5, 'SMITH, ROBERT'
select top 1 id, name
from mytable
where id = 5
order by len(name) desc
4

2 に答える 2

1

この場合、このようなものを作成したい場合は、where を使用して値を返す何かを使用することをお勧めします。Table-Valued User-Defined Function

Create dbo.YourFunction
(
  @parameter id
)
returns table
as
return select top 1 id, name
   from mytable
   where id = @parameter 
   order by len(name) desc

そしてそれを次のように使用します

select * from dbo.yourFunction(5)
于 2012-09-18T17:08:56.277 に答える
0

Albert Johnston外側の where 条件を最初に評価するように強制することはできないため、ビューは常に返されます。次のようなものが必要です。各 ID グループの最大長の名前/ID が得られます。

select
    name,
    id
from
(
    select
        name,
        id,
        row_number() OVER (partition by id order by len(name) desc) as [len]
    from 
        theTable
) As tbl1
where [len] = 1
于 2012-09-18T17:14:00.060 に答える