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