1

まず、くだらないデータベース構造を私に押し付けないでください。私たちは皆、対処しなければならない変更できないものを持っています。私は、アプリケーションに深く根付いているこれらのテーブルを継承しました。

次の 2 つのテーブルを検討してください。

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 コードでこれを行うことができますが、レポートには何千もの行があり、1 つのレポートだけで何万ものクエリを実行する可能性があります。1 つのクエリですべてを実行したいと思います。

4

3 に答える 3

2

Personnelテーブルの1 つと の 1 つの 2 つの個別のクエリを実行しTechniquesます。

Techniques クエリの結果を連想配列に処理します。インデックスは ID、値は名前です。

Personnel.Technique_ID フィールドを出力する場合、カンマ区切り値をリストとして処理します。リスト内の各項目をループし、Techniques 連想配列の値を出力します。

于 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

アップデート

もう 1 つの可能性は、Gordon の LIKE コードをXML パス トリックと組み合わせて、1 つのクエリですべてを返すことです。(どちらも非常に大きなテーブルを持つ速度の悪魔になるとは思いませんが、継承したスキーマを考えると...それは予想されることです。)

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 に答える