Tsql 使用MAX&;在具有WHERE限制的视图中按分组

Tsql 使用MAX&;在具有WHERE限制的视图中按分组,tsql,Tsql,这是我的要求。 我们的应用程序生成一条语句,该语句调用SQLServerDB中的视图。 此语句从视图中选择DISTINCT或GROUP BY数据字段 传递ID的受限子集 背景: 我使用的是在Windows Server 2008 R2上运行的SQL Server 2008 R2 我将用一个示例表来解释这个问题 给出此示例表:[TabA] ID [INT] DATA [VARCHAR(8)] --- ---- 51 A1 50 A

这是我的要求。 我们的应用程序生成一条语句,该语句调用SQLServerDB中的视图。 此语句从视图中选择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)

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

但我们期待

ID  DATA
--  ----
50  A1
110 A5
在视图中,似乎GROUPBY在WHERE条件之前执行。 由于我们无法从应用程序中调用存储过程, 我们必须依靠调用视图。 是否有其他可能按顺序进行区分或分组 视图中的数据字段(在本例中)。 ID字段不一定要使用MAX aggregate函数进行过滤。 但必须对他们施加限制

附笔。 在普通查询中执行此选择,包括 (
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和insert语句:

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')
任何帮助都将不胜感激

问候,,
Alberto

要使其按您所期望的方式工作,您需要从视图中删除
group by
。您没有在结果中看到例如“
50
”的原因是,它已被视图中的
分组依据过滤掉

您需要更改视图(如果没有其他人在使用它),或者创建如下新视图:

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

我们的交互式应用程序根据用户选择的“对象”生成SQL语句。然后在WHERE ID in(…)子句中使用这些对象的ID。要检索SQL DB数据,应用程序只允许通过表或视图进行访问,例如:SELECT ID,Data FROM ViewOnTabA WHERE ID in(50110100)或SELECT ID,Data FROM TabA WHERE ID in(50110100)。我们需要以不同的顺序获取数据值(示例中为A1、A5),而不管随附哪个ID。因此,我尝试使用聚合函数和分组方式来解决此请求。恐怕(如果我理解正确的话)这对您的问题没有帮助。您需要在运行时而不是在视图中应用聚合。Hi RoKa感谢您为搜索解决方案所做的努力。现在,我们尝试通过应用程序api中的解决方法来解决这个问题。
CREATE VIEW ViewOnTabA  /* or use a new name */
AS
 SELECT ta.ID, ta.DATA
 FROM TabA ta
GO
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