http://sqlfiddle.com/#!3/3ec1f/119
这是我的小提琴......我希望结果看起来像这样,但我正在使用的查询不会这样做:
我的查询问题是我似乎无法使用exclusion_flag条件排除“水晶头骨的王国”。我也不知道为什么合同3(失落弧的攻略)似乎也没出现。我已经用了几个小时辛苦工作,不知道问题是什么。我试着查看子查询,但我不确定这是解决方案......
答案 0 :(得分:3)
那里有几个问题/问题所以我会尝试单独解决它们。
1)你不能使用exclusion_flag排除“水晶头骨的王国”,因为contract_sid 7和8都引用了包含“水晶头骨的王国”的product_list_sid 3 - 你需要创建一个单独的product_list_sid如果你想要一份排除它的合同。
2)“失落弧的攻略”(contract_sid 3)没有显示,因为它是“单一产品”合同,并且您的查询仅使用product_list_id从范围加入product_list_join - contract_sid 3位于product_sid列中您需要一个单独的连接来满足使用product_sid而不是product_list_sid的合同(我假设合同不能同时使用)。这是一个非常狡猾的架构设计,但这是一个解决该问题的查询。注意使用LEFT OUTER JOIN来指示正在连接的表可能不包含任何行(例如,当scope.product_list_sid为NULL但scope.product_sid不是时)。
SELECT s.contract_sid,
c.contract_description,
ISNULL(p.product_description, p2.product_description) AS product_description
FROM scope s
JOIN contracts c ON (c.contract_sid = s.contract_sid)
LEFT OUTER JOIN
product_list_join plj ON (plj.product_list_sid = s.product_list_sid)
LEFT OUTER JOIN
products p ON (p.product_sid = plj.product_sid)
LEFT OUTER JOIN
products p2 ON (p2.product_sid = s.product_sid)
WHERE s.exclusion_flag = 'N'
ORDER BY s.contract_sid;
这是我的解决方案的SQLFiddle:http://sqlfiddle.com/#!3/fc62e/10
编辑:在发布之后我意识到你实际上在做什么 - 范围表不仅提供了合同的细节,还提供了从合同中排除的特定产品。同样,这是糟糕的架构设计,并且应该有一个单独的scope_exclusions表或者其他东西,但这里是一个查询,并按要求排除“水晶头骨的王国”:
SELECT inner_query.contract_description,
inner_query.product_description
FROM (
SELECT s.contract_sid,
c.contract_description,
ISNULL(p.product_sid, p2.product_sid) AS product_sid,
ISNULL(p.product_description, p2.product_description) AS product_description
FROM scope s
JOIN contracts c ON (c.contract_sid = s.contract_sid)
LEFT OUTER JOIN
product_list_join plj ON (plj.product_list_sid = s.product_list_sid)
LEFT OUTER JOIN
products p ON (p.product_sid = plj.product_sid)
LEFT OUTER JOIN
products p2 ON (p2.product_sid = s.product_sid)
WHERE s.exclusion_flag = 'N'
) inner_query
WHERE NOT EXISTS ( SELECT 1
FROM scope
WHERE exclusion_flag = 'Y'
AND contract_sid = inner_query.contract_sid
AND product_sid = inner_query.product_sid )
ORDER BY inner_query.contract_description;