回答

收藏

此公用表表达式的结果被评估多少次?

技术问答 技术问答 160 人阅读 | 0 人回复 | 2023-09-12

我正试图找出我们在最后一次测试迭代中发现的错误。它涉及一个使用公共表达式的查询。查询的主要主题是模拟第一聚合操作为此分组获取第一行)。9 ^8 `! U. p8 _2 A9 }+ t
问题是,在某些情况下,查询似乎完全选择了任何行动-从同一组返回多行,而有些组则完全被淘汰。然而,它 总是    选择正确的行数。* H6 L3 _3 T$ ^0 N
我在这里创建了最小的例子来发布。有客户和地址,以及定义他们关系的表格。多少. E, q  N0 D! I/ G* i
我期待着简化版本的实际查询,但我相信它应该有相同的特点,它用来解释什么,我认为这是一个很好的例子。. O3 [% E: L, R0 C
CREATE TABLE [Client] (ClientID int,Name varchar(20))CREATE TABLE [Address] (AddressID int,Street varchar(20))CREATE TABLE [ClientAddress] (ClientID int,AddressID int)INSERT [Client] VALUES (1,'Adam')INSERT [Client] VALUES (2,'Brian')INSERT [Client] VALUES (3,'Charles')INSERT [Client] VALUES (4,'Dean')INSERT [Client] VALUES (5,'Edward')INSERT [Client] VALUES (6,'Frank')INSERT [Client] VALUES (7,'Gene')INSERT [Client] VALUES (8,'Harry')INSERT [Address] VALUES (1,'Acorn Street')INSERT [Address] VALUES (2,'Birch Road')INSERT [Address] VALUES (3,'Cork Avenue')INSERT [Address] VALUES (4,'Derby Grove')INSERT [Address] VALUES (5,'Evergreen Drive')INSERT [Address] VALUES (6,'Fern Close')INSERT [ClientAddress] VALUES (1,1)INSERT [ClientAddress] VALUES (1,3)INSERT [ClientAddress] VALUES (2,2)INSERT [ClientAddress] VALUES (2,4)INSERT [ClientAddress] VALUES (2,6)INSERT [ClientAddress] VALUES (3,3)INSERT [ClientAddress] VALUES (3,5)INSERT [ClientAddress] VALUES (3,1)INSERT [ClientAddress] VALUES (4,4)INSERT [ClientAddress] VALUES (4,6)INSERT [ClientAddress] VALUES (5,1)INSERT [ClientAddress] VALUES (6,3)INSERT [ClientAddress] VALUES (7,2)INSERT [ClientAddress] VALUES (8,4)INSERT [ClientAddress] VALUES (5,6)INSERT [ClientAddress] VALUES (6,3)INSERT [ClientAddress] VALUES (7,5)INSERT [ClientAddress] VALUES (8,1)INSERT [ClientAddress] VALUES (5,4)INSERT [ClientAddress] VALUES (6,6);WITH [Stuff] ([ClientID],[Name],[Street],[RowNo]) AS(    SELECT        [C].[ClientID],       [C].[Name],       [A].[Street],       ROW_NUMBER() OVER (ORDER BY [A].[AddressID]) AS [RowNo]    FROM        [Client] [C] INNER JOIN        [ClientAddress] [CA] ON            [C].[ClientID] = [CA].[ClientID] INNER JOIN        [Address] [A] ON            [CA].[AddressID] = [A].[AddressID])SELECT    [CTE].[ClientID],            [CTE].[Name],   [CTE].[Street],   [CTE].[RowNo]FROM    [Stuff] [CTE]WHERE    [CTE].[RowNo] IN (SELECT MIN([CTE2].[RowNo]) FROM [Stuff] [CTE2] GROUP BY [CTE2].[ClientID])ORDER BY    [CTE].[Name] ASC,   [CTE].[Street] ASCDROP TABLE [ClientAddress]DROP TABLE [Address]DROP TABLE [Client]查询旨在获取所有客户及其第一个地址(ID最低地址)。在我看来,这应该能够工作。
9 z" {1 w8 H" A: _9 C3 [我有一个关于为什么有时不起作用的理论。CTE后面的声明在两个地方提到了CTE。如果CTE它是不确定的,并且已经运行了不止一次,那么CTE引用的两个地方的结果可能会有所不同。
4 l5 w( g* @) R$ |% v( o- j0 A% n在我的例子中,CTE的RowNo列使用ROW_NUMBER()和order" S% Z/ v: q% v; K
by当句子多次运行时,句子可能会导致不同的排名(我们根据地址和查询执行方法对客户端进行排名)。* m+ Y; r7 ^. W; f( w1 V3 O2 {2 A
因此,CTE和CTE2可能包含不同的结果吗?CTE只执行一次,我需要在其他地方找到这个问题吗?
6 m$ T' Z$ p( T/ G; W3 X/ b                                                                . q- P. N' |" K
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则