我有三张桌子
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