Sql 返回不同结果计数的两个查询
我测试了两个查询:Sql 返回不同结果计数的两个查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我测试了两个查询: 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 Rol
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'
它返回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'
这个返回1303
我尝试了这个查询来检查缺少的那些,结果是零
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'
这两者之间的区别在于对患者的连接。这是一个内部联接,因此可能是筛选结果。请注意,重复也可能导致问题
您可以确定缺少的行,因为缺少以下行:
select *
from AspNetUsers nu
where not exists (select 1 from patents p where p.id = nu.PatientId);
你试过了吗?
另外,尝试另一种方式进行检查查询:子查询到主查询,主查询到子查询您在第二次查询中得到了重复的查询。第一个使用来自患者的clinicid,而第二个使用来自aspusers表的clinicid。嫌疑犯是aspusers表的clinicid。检查其是否与患者相同。要从患者中找出减去aspusers的差异我们可以假设,对于每个查询,您保证每行获得一个且仅一个PatientID吗?@Xedni是的,id是唯一标识符列。我从AspNetUsers nu(不存在)运行select*,从患者p运行select*,其中p.id=nu.PatientID;到目前为止只找到1个结果,但clinicId为空,因此这不应该是两个有问题的用户之一。@prospector。我猜非患者有两个角色。我希望你是对的,但它只返回1个角色。另一种可能是AspNetUsers.PatientId为NULL。