我有三张桌子
Prospect—保存Prospect信息

id
name
projectID

潜在客户的样本数据
id | name | projectID
1  |  p1  |  1
2  |  p2  |  1
3  |  p3  |  1
4  |  p4  |  2
5  |  p5  |  2
6  |  p6  |  2

联合——保存联合信息
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

在各自的表中有一个或多个前景和一个或多个联合。一个潜在客户可能对每个联合点都有价值,也可能没有价值。
我想要一个SQL语句,它将提取给定项目的每个prospect的所有联合值,如果给定的联合和prospect的联合prospect表中不存在的值没有值,则显示NULL。
在projectd=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

我试过在prospect和联合表上使用一个内部连接,然后在联合prospect上使用一个左连接,但是在某个地方,我得到了prospect/联合对的笛卡尔积,这对我来说毫无意义
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

非常感谢您的指导!!

最佳答案

那么这对你会有用的。。。通过select作为第一个FROM表,针对该项目中的所有prospect和元素预先加入笛卡尔。然后,左连接到连体前景。很明显,您可以从result中更改/删除某些列,但至少所有列都在那里,在您想要的连接中,有您期望的精确结果。。。

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

10-05 19:44