2

我有三张桌子

潜在客户——持有潜在客户信息

id
name
projectID

Prospect 的样本数据

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 语句,它将提取给定项目的每个潜在客户的所有联合值,在给定联合和潜在客户的 ConjointProspect 表中不存在的值没有值的情况下显示 NULL。

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 加入的结果 - 在您的示例数据中,有 3 个项目 ID 为 1 的潜在客户和 3 个项目 ID 为 1 的联合体。基于项目 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

不确定这是否可行,但似乎 conjointprospects 需要位于您的联接的中心,以便正确地将潜在客户映射到联合。

于 2010-05-10T16:54:27.037 回答