|
我正试图找出我们在最后一次测试迭代中发现的错误。它涉及一个使用公共表达式的查询。查询的主要主题是模拟第一聚合操作为此分组获取第一行)。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
解决方案: |
|