为什么我不能根据条件排除这一行?

时间:2015-01-07 09:21:25

标签: mysql sql database

http://sqlfiddle.com/#!3/3ec1f/119

这是我的小提琴......我希望结果看起来像这样,但我正在使用的查询不会这样做:

img

我的查询问题是我似乎无法使用exclusion_flag条件排除“水晶头骨的王国”。我也不知道为什么合同3(失落弧的攻略)似乎也没出现。我已经用了几个小时辛苦工作,不知道问题是什么。我试着查看子查询,但我不确定这是解决方案......

1 个答案:

答案 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;

SQL小提琴:http://sqlfiddle.com/#!3/fc62e/14