wog*_*les 4 sql t-sql sql-server-2008
当我运行它时间歇性地得到不同的结果集...有时它给出1363,有时1365,有时1366结果.数据不会改变.可能导致这种情况的原因是否有办法防止它?查询看起来像这样:
SELECT *
FROM
(
SELECT
RC.UserGroupId,
RC.UserGroup,
RC.ClientId AS CLID,
CASE WHEN T1.MultipleClients = 1 THEN RC.Salutation1 ELSE RC.DisplayName1 END AS szDisplayName,
T1.MultipleClients,
RC.IsPrimaryRecord,
RC.RecordTypeId,
RC.ClientTypeId,
RC.ClientType,
RC.IsDeleted,
RC.IsCompany,
RC.KnownAs,
RC.Salutation1,
RC.FirstName,
RC.Surname,
Relationship,
C.DisplayName Client,
RC.DisplayName RelatedClient,
E.Email,
RC.DisplayName + ' is the ' + R.Relationship + ' of ' + C.DisplayName Description,
ROW_NUMBER() OVER (PARTITION BY E.Email ORDER BY Relationship DESC) AS sequence_id
FROM
SSDS.Client.ClientExtended C
INNER JOIN
SSDS.Client.ClientRelationship R WITH (NOLOCK)ON C.ClientId = R.ClientID
INNER JOIN
SSDS.Client.ClientExtended RC WITH (NOLOCK)ON R.RelatedClientId = RC.ClientId
LEFT OUTER JOIN
SSDS.Client.Email E WITH (NOLOCK)ON RC.ClientId = E.ClientId
LEFT OUTER JOIN
SSDS.Client.UserDefinedData UD WITH (NOLOCK)ON C.ClientId = UD.ClientId AND C.UserGroupId = UD.UserGroupId
INNER JOIN
(
SELECT
E.Email,
CASE WHEN (COUNT(DISTINCT RC.DisplayName) > 1) THEN 1 ELSE 0 END AS MultipleClients
FROM
SSDS.Client.ClientExtended C
INNER JOIN
SSDS.Client.ClientRelationship R WITH (NOLOCK)ON C.ClientId = R.ClientID
INNER JOIN
SSDS.Client.ClientExtended RC WITH (NOLOCK)ON R.RelatedClientId = RC.ClientId
LEFT OUTER JOIN
SSDS.Client.Email E WITH (NOLOCK)ON RC.ClientId = E.ClientId
LEFT OUTER JOIN
SSDS.Client.UserDefinedData UD WITH (NOLOCK)ON C.ClientId = UD.ClientId AND C.UserGroupId = UD.UserGroupId
WHERE
Relationship IN ('z-Group Principle', 'z-Group Member ')
AND E.Email IS NOT NULL
GROUP BY E.Email
) T1 ON E.Email = T1.Email
WHERE
Relationship IN ('z-Group Principle', 'z-Group Member ')
AND E.Email IS NOT NULL
) T
WHERE
sequence_id = 1
AND T.UserGroupId IN (Select * from iCentral.dbo.GetSubUserGroups('471b9cbd-2312-4a8a-bb20-35ea53d30340',0))
AND T.IsDeleted = 0
AND T.RecordTypeId = 1
AND T.ClientTypeId IN
(
'1', --Client
'-1652203805' --NTU
)
AND T.CLID NOT IN
(
SELECT DISTINCT
UDDF.CLID
FROM
SLacsis_SLM.dbo.T_UserDef UD WITH (NOLOCK)
INNER JOIN
SLacsis_SLM.dbo.T_UserDefData UDDF WITH (NOLOCK)
ON UD.UserDef_ID = UDDF.UserDef_ID
INNER JOIN
SLacsis_SLM.dbo.T_Client CLL WITH (NOLOCK)
ON CLL.CLID = UDDF.CLID AND CLL.UserGroup_CLID = UD.UserID
WHERE
UD.UserDef_ID in
(
'F68F31CE-525B-4455-9D50-6DA77C66FEE5',
'A7CECB03-866C-4F1F-9E1A-CEB09474FE47'
)
AND UDDF.Data = 'NO'
)
ORDER BY T.Surname
Run Code Online (Sandbox Code Playgroud)
编辑:
我删除了所有NOLOCK(包括视图和UDF中的那些),我仍然遇到同样的问题.我每次为嵌套的select(T)得到相同的结果,如果我将T的结果集放入查询开头的临时表中并连接到临时表而不是嵌套的select,那么最终的结果集是每次运行查询时都一样.
EDIT2:
我已经在ROW_NUMBER()上做了一些阅读...我正在通过电子邮件进行分区(其中有重复项)和按关系排序(其中只有2个关系中的1个).这会导致查询不确定,是否有办法解决?
EDIT3:
如果有人对http://www.mediafire.com/?qo5gkh5dftxf0ml感兴趣,这是实际执行计划.是否可以看到它是从执行计划中提交的读取运行的?我使用WinMerge比较了文件,唯一的区别似乎是计数(ActualRows ="").
EDIT4:
这有效:
SELECT * FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY B.Email ORDER BY Relationship DESC) AS sequence_id
FROM
(
SELECT DISTINCT
RC.UserGroupId,
...
) B...
Run Code Online (Sandbox Code Playgroud)
EDIT5:
当连续两次运行相同的ROW_NUMBER()查询(原始问题中的T,只选择RC.DisplayName和ROW_NUMBER)时,我会为某些人获得不同的排名:

有没有人有一个很好的解释/示例为什么或如何ROW_NUMBER()在包含重复项的结果集上每次运行时可以排名不同并最终改变结果的数量?
EDIT6:
好的,我觉得这对我来说很有意义.当人们2人拥有相同的电子邮件地址(例如丈夫和妻子)和关系时,会发生这种情况.我想在这种情况下,他们的ROW_NUMBER()排名是任意的,每次运行时都可以更改.
gbn*_*gbn 10
你全部使用NOLOCK意味着你正在进行脏读,并且会看到未提交的数据,将被回滚的数据,瞬态和不一致的数据等
取下这些,再试一次,报告请求
编辑:删除了NOLOCKS的一些选项