2

私は3つのテーブルを持っています

見込み客 -- 見込み客情報を保持します

id
name
projectID

見込み客のサンプルデータ

id | name | projectID
1  |  p1  |  1
2  |  p2  |  1
3  |  p3  |  1
4  |  p4  |  2
5  |  p5  |  2
6  |  p6  |  2

Conjoint -- コンジョイント情報を保持します

id
title
projectID

サンプルデータ

id | title  | projectID
1  | color  |  1
2  | size   |  1
3  | qual   |  1
4  | color  |  2
5  | price  |  2
6  | weight |  2

プロスペクトのコンジョイント値を保持する連想テーブルがあります。

ConjointProspect
id
prospectID
conjointID
value

サンプルデータ

id | prospectID | conjointID | value
1  |      1     |      1     |   20
2  |      1     |      2     |   30
3  |      1     |      3     |   50
4  |      2     |      1     |   10
5  |      2     |      3     |   40

それぞれのテーブルに 1 つ以上のプロスペクトと 1 つ以上のコンジョイントがあります。プロスペクトには、各コンジョイントの値がある場合とない場合があります。

特定のプロジェクトの各プロスペクトのすべてのコンジョイント値を抽出し、特定のコンジョイントとプロスペクトの ConjointProspect テーブルに存在しない値の値がない場合は NULL を表示する SQL ステートメントが必要です。

projectID = 1 の場合、これに沿ったもの

prospectID  | conjoint ID  | value
    1       |      1       |   20
    1       |      2       |   30
    1       |      3       |   50
    2       |      1       |   10
    2       |      2       |   NULL
    2       |      3       |   40
    3       |      1       |   NULL
    3       |      2       |   NULL
    3       |      3       |   NULL

プロスペクト テーブルとコンジョイント テーブルで内部結合を使用してから、ConjointProspect で左結合を使用しようとしましたが、どこかで意味をなさないプロスペクト/コンジョイント ペアのデカルト積を取得しています (私にとって)

SELECT p.id, p.name, c.id, c.title, cp.value
FROM prospect p
INNER JOIN  conjoint c ON p.projectID = c.projectid
LEFT JOIN conjointProspect cp ON cp.prospectID = p.id
WHERE  p.projectID = 2
ORDER BY p.id, c.id

prospectID  | conjoint ID  | value
    1       |      1       |   20
    1       |      2       |   30
    1       |      3       |   50
    1       |      1       |   20
    1       |      2       |   30
    1       |      3       |   50
    1       |      1       |   20
    1       |      2       |   30
    1       |      3       |   50
    2       |      1       |   10
    2       |      2       |   40
    2       |      1       |   10
    2       |      2       |   40
    2       |      1       |   10
    2       |      2       |   40
    3       |      1       |   NULL
    3       |      2       |   NULL
    3       |      3       |   NULL

ご指導大歓迎です!!

4

2 に答える 2

2

次に、これはうまくいきます...最初のFROMテーブルとして選択を介して、そのプロジェクト内のすべての見込み客と要素に対してデカルトを事前に結合します。次に、conjoinprospect に左結合します。明らかに、結果から特定の列を変更/削除できますが、少なくともすべてが、期待している正確な結果で必要な結合に含まれています...

SELECT 
       PJ.*,
       CJP.Value
    FROM 
       (   SELECT 
                   P.ID ProspectID,
                   P.Name,
                   P.ProjectID,
                   CJ.Title,
                   CJ.ID ConJointID
               FROM 
                   Prospect P,
                   ConJoint CJ
               where 
                       P.ProjectID = 1
                   AND P.ProjectID = CJ.ProjectID
               ORDER BY 
                   1, 4
         ) PJ
         LEFT JOIN conjointProspect cjp 
             ON PJ.ProspectID = cjp.prospectID 
            AND PJ.ConjointID = cjp.conjointid
     ORDER BY 
        PJ.ProspectID,
        PJ.ConJointID
于 2010-05-10T17:27:29.617 に答える
0

デカルト積は、プロジェクト ID で結合した結果です。サンプル データには、プロジェクト ID が 1 の 3 つの見込み客と、プロジェクト ID が 1 の結合が 3 つあります。プロジェクト ID に基づいて結合すると、データは 9 行になります。これはあなたが得ているものです。プロスペクトとコンジョイントの間のマッピングを保持しているため、実際には conjointprospects テーブルを介して参加する必要があるようです。

次のようなことを試してみるとどうなりますか:

SELECT p.id, p.name, c.id, c.title, cp.value
FROM prospect p
LEFT JOIN conjointProspect cp ON cp.prospectID = p.id
RIGHT JOIN conjoint c ON cp.conjointID = c.id
WHERE  p.projectID = 2
ORDER BY p.id, c.id

それが機能するかどうかはわかりませんが、プロスペクトをコンジョイントに正しくマッピングするには、コンジョイントプロスペクトが結合の中心にある必要があるようです。

于 2010-05-10T16:54:27.037 に答える