两个查询返回不同的结果计数

two queries returning different result counts

我测试了两个查询:

SELECT [FirstName], [LastName], [PreferredName], [DOB], [Sex], LastActivityDate,LoweredEmail, EmailConfirmed FROM [Patients] p 
join AspNetUsers u on p.Id=u.PatientId 
join AspNetUserRoles r on u.Id=r.UserId
WHERE (p.[ClinicId] = 1) and RoleId='16874754-779a-fbae-8caf-bbbb2344b7a6'

它 returns 1301 个结果

但是这个查询

SELECT AspNetUsers.id FROM dbo.AspNetUsers 
INNER JOIN dbo.AspNetUserRoles ON AspNetUsers.Id=AspNetUserRoles.UserId 
WHERE AspNetUsers.ClinicId = 1 and AspNetUserRoles.RoleID='16874754-779a-fbae-8caf-bbbb2344b7a6'

这个returns1303

我试过这个查询来检查丢失的结果,结果为零

    SELECT [FirstName], [LastName], [PreferredName], [DOB], [Sex], LastActivityDate,LoweredEmail, EmailConfirmed FROM [Patients] p 
    join AspNetUsers u on p.Id=u.PatientId 
    join AspNetUserRoles r on u.Id=r.UserId
    WHERE (p.[ClinicId] = 1) and RoleId='16874754-779a-fbae-8caf-bbbb2344b7a6'
    and u.PatientId not in
    (
    SELECT AspNetUsers.PatientId FROM dbo.AspNetUsers INNER JOIN 
    dbo.AspNetUserRoles ON AspNetUsers.Id=AspNetUserRoles.UserId WHERE
    AspNetUsers.ClinicId = 1 and 
    AspNetUserRoles.RoleID='16874754-779a-fbae-8caf-bbbb2344b7a6'
    )

我如何找出哪个是正确的,为什么我会有所不同?

第二个查询返回 1303 条记录:

SELECT AspNetUsers.id
FROM dbo.AspNetUsers INNER JOIN
     dbo.AspNetUserRoles
     ON AspNetUsers.Id = AspNetUserRoles.UserId 
WHERE AspNetUsers.ClinicId = 1 and
      AspNetUserRoles.RoleID='16874754-779a-fbae-8caf-bbbb2344b7a6'

第一个查询返回 1301 条记录:

SELECT [FirstName], [LastName], [PreferredName], [DOB], [Sex],   
       LastActivityDate, LoweredEmail, EmailConfirmed
FROM [Patients] p join
     AspNetUsers u
     on p.Id = u.PatientId join
     AspNetUserRoles r
     on u.Id = r.UserId
WHERE (p.[ClinicId] = 1) and RoleId='16874754-779a-fbae-8caf-bbbb2344b7a6' 

这两者的区别在于 Patients 上的连接。这是一个 inner join,所以它可能是过滤结果。请注意,重复项也可能导致问题。

您可以使用以下方法确定缺失的行(因为有些缺失):

select *
from AspNetUsers nu
where not exists (select 1 from patents p where p.id = nu.PatientId);

您尝试过 SELECT DISTINCT 吗? 也可以用另一种方式尝试检查查询(子查询到主查询,主查询到子查询)

您在第二个查询中得到了重复项。第一个使用 patient 中的 clinicid,而第二个使用 aspusers table 中的 clinicid。嫌疑人是 aspusers table 的 clinicid。检查它与 patient 中的相同。从 patient

中求差 aspusers