【问题标题】:Where & Top interaction in SQL Server ViewSQL Server 视图中的 Where & Top 交互
【发布时间】:2012-09-10 23:37:27
【问题描述】:

你知道如何说服 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

【问题讨论】:

    标签: sql sql-server tsql where sql-view


    【解决方案1】:

    您的视图将始终返回 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
    

    【讨论】:

      【解决方案2】:

      在这种情况下,如果你想创建这样的东西,我建议使用一个使用 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)
      

      【讨论】:

        猜你喜欢
        • 2019-11-27
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多