我有三张桌子
展望 - 持有潜在客户信息
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语句,它将为给定项目的每个前景提取所有联合值,显示NULL,其中对于给定联合和前景的ConjointProspect表中没有值的值没有
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
非常感谢指导!!
答案 0 :(得分:2)
然后这将对你有用...通过select作为你的第一个FROM表,预先加入Cartesian对抗该项目中的所有潜在客户和元素。然后,左连接到concoinprospect。显然,您可以更改/删除结果中的某些列,但至少所有列都在您想要的连接中,并且具有您期望的精确结果...
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
答案 1 :(得分: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
不确定这是否有效,但似乎联合方案需要位于联接的中心才能正确地将潜在客户映射到联合。