2012-09-18 63 views
4

你知道如何說服SQL Server來考慮視圖中的WHERE子句? 它看起來像SQL Server正在運行只是我的看法,評價TOP 1,然後應用「其中id = N」子句可以過濾視圖的結果集。 例子:凡與在SQL Server視圖頂互動

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 

回答

1

在這種情況下,如果你想創造一些東西這樣,我會建議使用的東西,使用其中將返回一個值,所以最好創建一個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) 
0

你的觀點總是返回Albert Johnston因爲它不可能迫使它首先評估條件的外部。你需要這樣的東西之後,會給你每個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