这是我的请求。 我们的应用程序生成一个语句,该语句调用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限制。
在普通查询中执行此选择,包括
(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')
非常感谢任何帮助。
此致 阿尔贝托
答案 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