¿Hay alguna forma de obtener resultados diferentes para la misma consulta SQL si los datos permanecen iguales?
Obtengo un conjunto de resultados diferente para esta consulta de forma intermitente cuando la ejecuto ... a veces da 1363, a veces 1365 y otras 1366 resultados. Los datos no cambian. ¿Qué podría estar causando esto y hay alguna manera de prevenirlo? La consulta se parece a esto:
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
EDITAR
He eliminado todos los NOLOCK (incluidos los de vistas y UDF) y sigo teniendo el mismo problema. Obtengo los mismos resultados cada vez que selecciono anidado (T) y si pongo el conjunto de resultados de T en una tabla temporal al comienzo de la consulta y me uno a la tabla temporal en lugar de la selección anidada, entonces el conjunto de resultados final es lo mismo cada vez que ejecuto la consulta.
EDIT2:
He estado leyendo un poco más en ROW_NUMBER () ... Estoy particionando por correo electrónico (de los cuales hay duplicados) y ordenando por Relación (donde solo hay 1 de 2 relaciones). ¿Podría esto causar que la consulta no sea determinista y habría alguna forma de solucionarlo?
EDIT3:
Aquí están los planes de ejecución reales si alguien está interesadohttp: //www.mediafire.com/? qo5gkh5dftxf0ml. ¿Es posible ver que se ejecuta como lectura confirmada desde el plan de ejecución? Comparé los archivos con WinMerge y las únicas diferencias parecen ser los recuentos (ActualRows = "").
EDIT4:
Esto funciona
SELECT * FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY B.Email ORDER BY Relationship DESC) AS sequence_id
FROM
(
SELECT DISTINCT
RC.UserGroupId,
...
) B...
EDIT5:
Al ejecutar la misma consulta ROW_NUMBER () (T en la pregunta original, simplemente seleccionando RC.DisplayName y ROW_NUMBER) dos veces seguidas obtengo un rango diferente para algunas personas:
¿Alguien tiene una buena explicación / ejemplo de por qué o cómo ROW_NUMBER () sobre un conjunto de resultados que contiene duplicados puede clasificarse de manera diferente cada vez que se ejecuta y, en última instancia, cambiar el número de resultados?
EDIT6:
Ok, creo que esto tiene sentido para mí ahora. Esto ocurre cuando las personas 2 personas tienen la misma dirección de correo electrónico (por ejemplo, un par de marido y mujer) y una relación. Supongo que en este caso su clasificación ROW_NUMBER () es arbitraria y puede cambiar cada vez que se ejecuta.