SQL限制基于使用逗号分隔列表的IN子句的Count函数

时间:2016-07-08 16:26:17

标签: sql

我有一张Matricies(JobMatricies)ID,Desc,DeptIDs

1   Admin (PM)  6,7,138,131,11,9,10,134,135,14,105,129
5   Sales Processing (PM)   92,16,153,17,91,32,26,93,99,18,89,90,155,19
6   Construction Processing (PM)    100,36,20,136,22,88,23,25,34,106,38,39,132,41,42,43,154,152,84

DeptID是一个逗号分隔的部门列表,我想用它来计算Matrix表示的记录数。

通常我会做类似......

select  Matrix_ID, 
        Matrix_Desc, 
        JobCount =  (select count(sched_ID) from JobSchedule where dept_ID in                                                    (**92,16,153,17,91,32,26,93,99,18,89,90,155,19**))
from    jobMatrices

如何使用每个矩阵存储的ID替换硬编码分隔字符串,以便我可以根据每个矩阵存储的逗号分隔字符串生成具有自己唯一计数的matricies列表。

由于

3 个答案:

答案 0 :(得分:0)

我刚回答了一个类似的问题,海报想要在类似的表格布局中对分隔的数字列表求和。我的解决方案使用Oracle中的CTE将该列表转换为CTE表,允许您加入它。我相信如果你的RDBMS支持那种技术将在这里使用。请看一下:https://stackoverflow.com/a/38231838/2543416

答案 1 :(得分:0)

select s.ID
     , m."Desc"
  from JobSchedule s
     , jobMatrices m
 where position(',' || s.ID || ',' in ',' || m.DeptIDs || ',')>0;

select m."Desc"
     , count(s.ID) JobCount
  from JobSchedule s
     , jobMatrices m
 where position(',' || s.ID || ',' in ',' || m.DeptIDs || ',')>0
 group by m."Desc";

答案 2 :(得分:0)

在MySQL中,您可以将逗号分隔的字符串视为SET,并且内置函数FIND_IN_SET()有助于:

select  m.Matrix_ID, 
        m.Matrix_Desc, 
        (select count(sched_ID) from JobSchedule 
         where FIND_IN_SET(dept_ID, m.DeptIds)) AS JobCount
from    jobMatrices AS m;

然而,这会有可怕的性能。

如果您使用除MySQL以外的某些RDBMS,他们可能会使用不同的解决方案,其工作方式类似。

您应该在问题中具体说明并适当标记您的问题。您只标记了问题,但这是许多RDBMS供应商使用的语言