C# 使用单个查询仅选择非匹配项(仅限联接)

C# 使用单个查询仅选择非匹配项(仅限联接),c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我有一个非常简单的多对多表结构,见下面的SQLServerT-SQL 我需要: 选择所有没有关联人员的作业 选择仅与不可见和/或已删除的人员关联的所有作业 选择已删除的所有作业。 所有这些都应该返回一个结果表 不使用in/NOT in、嵌套的SELECT、UNION或temp表等,在单个仅联接的查询中是否可以实现这一点 模式: 人 人事 工作 我应该能够单独执行每个查询,然后在代码中连接数据集,但我很好奇是否有更简单的方法使用连接来实现这一点 如果正确的话,伪代码的响应很好 谢谢 试试看 sel

我有一个非常简单的多对多表结构,见下面的SQLServerT-SQL

我需要:

选择所有没有关联人员的作业 选择仅与不可见和/或已删除的人员关联的所有作业 选择已删除的所有作业。 所有这些都应该返回一个结果表

不使用in/NOT in、嵌套的SELECT、UNION或temp表等,在单个仅联接的查询中是否可以实现这一点

模式:

人事

工作

我应该能够单独执行每个查询,然后在代码中连接数据集,但我很好奇是否有更简单的方法使用连接来实现这一点

如果正确的话,伪代码的响应很好

谢谢

试试看

select j.*
from personjobs pj
full join jobs j on pj.jobid = j.id
full join person p on pj.personid = p.id
where pj.personid is null
or p.isdeleted = 1
or p.isvisible = 0
or j.isdeleted = 1
CASE语句用于识别每个原始数据的给定条件。如果你不需要了解他们,只需删除它

Select J.Id, CASE WHEN PersonVisible Is Null THEN '1 - Not Associated'
                  WHEN PersonVisible = 1 OR PersonDeleted = 1 THEN '2 - Person NotVisible/Deleted'
                  WHEN J.Deleted = 1 THEN '3 - Deleted Jobs'
             ELSE '4 - All Except above' END as Conditions
From Jobs J Left Join
    (Select jobId,IsVisible PersonVisible, IsDeleted PersonDeleted
     From Person p join PersonJobs pj on p.Id = pj.personId
    ) X On J.Id = X.jobId
Order by Conditions

user2864740不幸的是,它们都受到C的亚音速无联合支持的限制,并且IN/NOT IN限制为2100项[由于参数化查询]。我可以很容易地编写亚音速内联查询来实现这一点,或者单独选择并自己构建联合,但我想在得出结论之前我应该先问一下:这个问题是关于TSQL还是亚音速的?:>无论如何,考虑创建一个视图-然后所有复杂的东西都被保存在一个闪亮的密封的小包中,有一个精致的界面。难道这不可能得到一个与一个医生不相关但与另一个医生有联系的工作吗?我认为OP提到嵌套的选择是无效的。同样,对于第二个需求行,逻辑也不正确。选择仅与不可见和/或已删除的人员关联的所有作业。据我所知,如果该作业有任何与之关联的可见和/或未删除的人员ID,则该人员ID不应属于选择的一部分。但是你发布的查询不会这样做。
  ID
  IsDeleted
select j.*
from personjobs pj
full join jobs j on pj.jobid = j.id
full join person p on pj.personid = p.id
where pj.personid is null
or p.isdeleted = 1
or p.isvisible = 0
or j.isdeleted = 1
Select J.Id, CASE WHEN PersonVisible Is Null THEN '1 - Not Associated'
                  WHEN PersonVisible = 1 OR PersonDeleted = 1 THEN '2 - Person NotVisible/Deleted'
                  WHEN J.Deleted = 1 THEN '3 - Deleted Jobs'
             ELSE '4 - All Except above' END as Conditions
From Jobs J Left Join
    (Select jobId,IsVisible PersonVisible, IsDeleted PersonDeleted
     From Person p join PersonJobs pj on p.Id = pj.personId
    ) X On J.Id = X.jobId
Order by Conditions