4

你知道如何说服 SQL Server 在视图中考虑 WHERE 子句吗?看起来 SQL Server 只运行我的视图,评估 TOP 1,然后应用“where id=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 回答