Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回不同结果计数的两个查询_Sql_Sql Server_Tsql - Fatal编程技术网

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。