怪异的查询行为:相同的查询,在视图内时有不同的结果

问题描述 投票:0回答:4

同一查询在视图内会带来不同的结果。

我尝试强制使用相同的代码页、相同的数据类型、通用查询表达式...但没有成功。

看看这个简单的查询:

SELECT TOP 100 CompanyID, SubsidiaryID 
FROM STAGING.SALESAX S
INNER JOIN Subsidiary SU
ON S.CompanyID = SU.SubsidiaryAXCode

它返回所有预期的 100 行。

如果我在视图中使用

EXACT SAME QUERY

CREATE VIEW [STAGING].[VSalesAXBASE]    
AS    
SELECT TOP 100 CompanyID, SubsidiaryID 
FROM STAGING.SALESAX S
INNER JOIN Subsidiary SU
ON S.CompanyID = SU.SubsidiaryAXCode

GO

SELECT * FROM [STAGING].[VSalesAXBASE]

它返回 0 ROWS

screenshots of me running the query in two ways

Screenshot of query updated without TOP Statement

sql sql-server sql-server-2017 sql-view
4个回答
3
投票

您可以在

SALESAX
表前添加
STAGING.
,但不要在查询中为
Subsidiary
表添加前缀。为查询中的所有表添加前缀。

一种可能性是存在多个

Subsidiary
表,并且查询在视图上下文中使用不同的表。

顺便说一句,在查询的

SELECT
部分中为列添加表名前缀也是一个好习惯。例如,现在很难知道列
CompanyID
SubsidiaryID
来自哪个表。


0
投票

解决方案是将 DBO 架构添加到辅助表中。感谢 @VladimirBaranov、@IMSoP 和 @Augustina(Codec) 的建议

看起来视图的执行上下文可能与当前用户不同(需要对此进行更多检查)。

Solution


0
投票

如果您有一个使用特定架构的视图,并且它引用了使用默认架构的表,那么您需要检查视图架构中是否存在重复的表名,其中包含不同的数据。 所以查看test.foo是

create view test.foo as
(
  select col1 from bar
)
go

如果您只是单独运行查询,它将使用默认架构(通常

dbo
)。 但是,如果还有一个现有的
test.bar
表,那么它将使用该表,因为视图正在该上下文中运行。

-- this will give different results if dbo.bar and test.bar have different data

select * from test.foo

视图需要如下以确保引用正确的表。

create view test.foo as
(
  select col1 from test.bar
)
go

-1
投票

除非使用显式的 Order By 子句,否则 SQL 不保证结果的排序。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.