【问题标题】:get All records which has all IDs passed in comma separated string in sql server获取在sql server中以逗号分隔的字符串传递所有ID的所有记录
【发布时间】:2019-12-04 13:38:19
【问题描述】:

我有两张表:一张是tutor,另一张是TutorSubject。现在我想得到所有那些以逗号分隔的字符串传递所有科目的导师。例如,下面是我使用以下查询得到的数据截图:

Select * from TutorSubject where SubjectId in (92, 1, 2, 91)

输出是:

现在我想要获得的是:我想要获得所有记录或所有拥有所有这些 subjectId 的导师。意味着特定的 Tutor 应该将所有主题都以字符串形式传递。根据上面的截图结果。我应该只找一位 id 为:31 的导师。

【问题讨论】:

  • 我不明白。导师 31 缺少主题 106。
  • 数据图像确实对我们没有帮助。当我们不知道数据在您提出问题之前 是什么样子时,输出数据的帮助就更小了。当表tutor 不在您的 SQL 中时,它与您的问题有什么关系?
  • @downvoters 请发表评论

标签: sql sql-server performance


【解决方案1】:

如果你想要所有科目的导师,你可以使用group byhaving

Select tutorid
from TutorSubject
where SubjectId in (92, 106, 1, 2, 91)
group by tutorid
having count(*) = 5;  -- 5 is the length of the string

如果你想传入这个:

with s as (
      select convert(int, value) as subjectid
      from string_split(@s)
     )
select tutorid
from tutorsubject ts join
     s
     on ts.subjectid = s.subjectid
group by tutorid
having count(*) = (select count(*) from s);

【讨论】:

    【解决方案2】:

    我想获取所有记录或拥有所有这些 subjectId 的所有导师。

    如果您想查看导师拥有 5 个SubjectIds 的所有TutorSubject 记录,您可以进行窗口计数并将其用于过滤:

    select *
    from (
        select t.*, count(*) over(partition by TutorId) cnt
        from TutorSubject t
        where SubjectId in (1, 2, 91, 92, 106)
    ) t
    where cnt = 5
    

    注意:这假设 (TutorId, SubjectId) 元组在表 TutorSubject 中是唯一的。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多