1

首先,请不要对我持有蹩脚的数据库结构。我们都有必须处理且无法更改的事情,我继承了这些在应用程序中根深蒂固的表格。

考虑这两个表:

Personnel
+-----+-------+--------------+
| ID  | Name  | TECHNIQUE_ID |
+-----+-------+--------------+
| 134 | Bob   | 1,2,4        |
+-----+-------+--------------+
| 135 | Mary  | 1,3,4        |
+-----+-------+--------------+
| 136 | Frank | 2            |
+-----+-------+--------------+

Techniques
+-----+----------+
| ID  | Name     |
+-----+----------+
| 1   | Fishing  |
+-----+----------+
| 2   | Archery  |
+-----+----------+
| 3   | Bowling  |
+-----+----------+
| 4   | Hiking   |
+-----+----------+

我需要的是每个人的列表以及他们执行的技术的逗号分隔列表。基本上将“1,3,4”变成“钓鱼、保龄球、徒步”。

我可以通过嵌套查询在 CF 代码中执行此操作,但报告有数千行......这意味着它可能仅针对一份报告运行数万个查询。我宁愿在一个查询中完成所有操作。

4

3 回答 3

2

执行 2 个单独的查询,其中一个Personnel表和一个Techniques.

将技术查询结果处理成一个关联数组,其中索引是 ID,值是名称。

输出 Personnel.Technique_ID 字段时,将逗号分隔值作为列表处理。循环遍历列表中的每个项目,并输出技术关联数组的值。

于 2013-06-10T16:39:45.877 回答
1

您可以使用以下方法进行加入like

select p.*
from Personnel p join
     Techniques t
     on ','+ p.TECHNIQUE_ID+',' like '%,'+cast(t.id as varchar(255))+',%'

你真的需要这个作为连接字符串吗?或者单独的行是否足够好?

于 2013-06-10T17:00:40.927 回答
0

更新

另一种可能性是将 Gordon 的 LIKE 代码与XML Path 技巧结合起来,在一个查询中返回所有内容。(我怀疑其中任何一个都将成为具有非常大表的速度恶魔,但鉴于您继承的架构......这是可以预料的。)

SELECT  p.id,
        STUFF( (  SELECT ','+ cast(name as varchar(10)) 
                  FROM   Techniques t 
                  WHERE  ','+ p.Technique_ID+',' LIKE '%,'+ cast(t.id as varchar(255)) +',%'
                  FOR    XML path('')
                )
                , 1,1,'') TechniqueList
FROM   Personnel p

(不是一个完整的答案,但评论太长了......)

如果您只显示信息,则可以将Gordon 的查询与分组组合cfoutput以产生所需的输出。(请务必订购Personnel.name结果techniques.name

代码:

<cfoutput query="yourQuery" group="id">
    <cfset skills = []>
    <cfoutput>
        <cfset arrayAppend(skills, skillTitle)>
    </cfoutput>

    NAME: #name# | 
    SKILLS: #arrayToList(skills)#<br>
</cfoutput>

结果:

NAME: Bob   | SKILLS: Archery,Fishing,Hiking
NAME: Frank | SKILLS: Archery
NAME: Mary  | SKILLS: Bowling,Fishing,Hiking
于 2013-06-10T18:08:29.943 回答