gpt4 book ai didi

sql - T-SQL SELECT TOP 返回重复项

转载 作者:行者123 更新时间:2023-12-03 02:48:03 24 4
gpt4 key购买 nike

我使用的是 SQL Server 2008 R2。

我不确定我是否发现了一个奇怪的 SQL 怪癖,或者(更有可能)我的代码中的某些内容导致了这种奇怪的行为,特别是在 Google 没有发现任何结果的情况下。我有一个名为 vwResponsible_Office_Address 的 View 。

SELECT * FROM vwResponsible_Office_Address

..返回 403 行

这段代码:

SELECT  TOP 1000 *  FROM vwResponsible_Office_Address

..返回 409 行,因为它包含 6 个重复项。

但是这个:

SELECT  TOP 1000 *  FROM vwResponsible_Office_Address
ORDER BY ID

..再次返回 403 行。

如果相关,我可以发布 View 的代码,但是 SELECT TOP 以这种方式工作有意义吗?我知道 SELECT TOP 可以以任何顺序返回记录,但不明白为什么返回的记录数应该有所不同。

View 确实使用交叉应用,这可能会如何影响结果集?

编辑:根据要求查看定义

CREATE VIEW [dbo].[vwResponsible_Office_Address] 
AS
SELECT fp.Entity_ID [Reg_Office_Entity_ID],
fp.Entity_Name [Reg_Office_Entity_Name],
addr.Address_ID
FROM [dbo].[Entity_Relationship] er
INNER JOIN [dbo].[Entity] fp
ON er.[Related_Entity_ID] = fp.[Entity_ID]
INNER JOIN [dbo].[Entity_Address] ea
ON ea.[Entity_ID] = fp.[Entity_ID]
CROSS APPLY (
SELECT TOP 1 Address_ID
FROM [dbo].[vwEntity_Address] vea
WHERE [vea].[Entity_ID] = fp.Entity_ID
ORDER by ea.[Address_Type_ID] ASC, ea.[Address_ID] DESC
) addr
WHERE [Entity_Relationship_Type_ID] = 25 -- fee payment relationship

UNION

SELECT ets.[Entity_ID],
ets.[Entity_Name],
addr.[Address_ID]
FROM dbo.[vwEntity_Entitlement_Status] ets
INNER JOIN dbo.[Entity_Address] ea
ON ea.[Entity_ID] = ets.[Entity_ID]
CROSS APPLY (
SELECT TOP 1 [Address_ID]
FROM [dbo].[vwEntity_Address] vea
WHERE vea.[Entity_ID] = ets.[Entity_ID]
ORDER by ea.[Address_Type_ID] ASC, ea.[Address_ID] DESC
) addr
WHERE ets.[Entitlement_Type_ID] = 40 -- registered office
AND ets.[Entitlement_Status_ID] = 11 -- active

最佳答案

我认为存在一些不确定性,这意味着不同的访问方法可以返回不同的结果。

查看 View 定义,唯一可能出现的位置是 vwEntity_AddressEntity_ID 存在一些重复项。

在这种情况下,这将使 top 1 Address_ID 返回任意值,这将影响 union 操作删除重复项时的结果。

这确实看起来非常可疑

SELECT TOP 1 [Address_ID]
FROM [dbo].[vwEntity_Address] vea
WHERE vea.[Entity_ID] = ets.[Entity_ID]
ORDER by ea.[Address_Type_ID] ASC, ea.[Address_ID] DESC

您正在交叉应用中按外部查询的值进行排序。这绝对不会产生任何影响,因为这些对于特定的CROSS APPLY 调用来说将是不变的。

你可以尝试更改为

SELECT TOP 1 [Address_ID]
FROM [dbo].[vwEntity_Address] vea
WHERE vea.[Entity_ID] = ets.[Entity_ID]
ORDER by vea.[Address_ID] DESC

关于sql - T-SQL SELECT TOP 返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7663945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com