使用MAX&汇总数据具有WHERE限制的VIEWS中的GROUP BY

时间:2015-10-28 09:12:26

标签: tsql

这是我的请求。 我们的应用程序生成一个语句,该语句调用SQL-Server数据库中的视图。 此语句从视图中选择DISTINCT或GROUP BY数据字段 传递受限制的ID子集。

背景:

我正在使用在Windows Server 2008 R2上运行的SQL-Server 2008 R2 通过示例表,我将尝试解释该问题。

鉴于此示例表:[TabA]

ID [INT]    DATA [VARCHAR(8)]  
---         ----
51           A1 
50           A1 
110          A5
100          A5 

然后我们创建以下视图:

CREATE VIEW ViewOnTabA
AS
 SELECT
   MAX(ta.ID) As ID, ta.DATA
 FROM 
   TabA ta
 GROUP BY ta.DATA
GO

使用我们的应用程序生成的此语句, 我们称视图传递一些ID值:

SELECT 
 ID, DATA
FROM ViewOnTabA  
WHERE ID in (51,50,110,100)

结果是好的 数据字段已分组并完整:

ID  DATA
--  ----
51  A1
110 A5

如果不是所有ID,我们只传递较小的ID号:(50而不是51) ...

WHERE ID in (50,110,100)

结果不完整(缺少ID 50):

ID  DATA
--  ----
110 A5

但我们期待

ID  DATA
--  ----
50  A1
110 A5

似乎在VIEW中,GROUP BY在WHERE条件之前执行。 因为我们无法从我们的应用程序调用存储过程, 我们必须依赖于调用视图。 是否还有其他可能有DISTINCT或GROUP BY订单 VIEW中的DATA字段(在示例中) 不一定要使用MAX聚合函数过滤ID字段。 但必须对其施加Where限制。

P.S。

在普通查询中执行此选择,包括 (WHERE ID in ...)限制它可以正常工作:

 SELECT
   MAX(ta.ID) As ID, ta.DATA
 FROM 
   TabA ta
 WHERE ID in (50,110,100)
 GROUP BY ta.DATA

输出>>>>

ID  DATA
--  ----
50  A1
110 A5

用于模拟此示例 这里是创造&插入语句:

create table TabA 
(
ID  int ,
DATA varchar(8)
)
go

insert into TabA values (51,'A1')
insert into TabA values (50,'A1')
insert into TabA values (110,'A5')
insert into TabA values (100,'A5')

非常感谢任何帮助。

此致 阿尔贝托

1 个答案:

答案 0 :(得分:0)

为了让您按照预期的方式工作,您需要从视图中删除group by。你没有看到的原因,例如结果中的“50”是因为它已被视图中的group by过滤掉了。

您需要更改视图(如果没有其他内容正在使用它),或者创建这样的新视图:

CREATE VIEW ViewOnTabA  /* or use a new name */
AS
 SELECT ta.ID, ta.DATA
 FROM TabA ta
GO

...然后在此视图上运行带有where子句的select语句。

SELECT
   MAX(ta.ID) As ID, ta.DATA
 FROM 
   ViewOnTabA ta  /* or use the new view's name */ 
 WHERE ta.ID in (50,110,100)
 GROUP BY ta.DATA