为什么我不能根据条件排除此行?
Why can't I exclude this row based on a condition?
http://sqlfiddle.com/#!3/3ec1f/119
这是我的 fiddle...我希望结果看起来像这样,但我使用的查询不这样做:
我的查询问题是我似乎无法使用 exclusion_flag 条件排除 "The Kingdom of the Crystal Skull"。我也不知道为什么 Contract 3 (Raiders of the Lost Arc) 似乎也没有出现。我已经为此苦苦挣扎了几个小时,但不知道问题出在哪里。我尝试查看子查询,但我不确定这是否是解决方案...
那里有几个 questions/issues 所以我会尝试单独解决它们。
1) 您不能使用 exclusion_flag 排除 "The Kingdom of the Crystal Skull" 因为 contract_sid 7 和 8 都引用 product_list_sid 3 其中包括 "The Kingdom of the Crystal Skull" -如果您想要一份排除它的合同,则需要创建一个单独的 product_list_sid。
2) "Raiders of the Lost Arc" (contract_sid 3) 未显示,因为它是 "single product" 合同,您的查询仅使用 product_list_join 从范围加入 product_list_id - contract_sid 3 在 product_sid 列中,因此您需要一个单独的连接来满足使用 product_sid 而不是 product_list_sid 的合同(我假设合同不能同时使用)。这是一个非常狡猾的架构设计,但这里有一个解决该问题的查询。请注意使用 LEFT OUTER JOIN 表示正在连接的 table 可能不包含任何行(例如,当 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
编辑:发布此消息后,我意识到您实际上在尝试做什么 - 范围 table 不仅提供了合同的详细信息,还提供了要从合同中排除的特定产品。同样,这是糟糕的架构设计,应该有一个单独的 scope_exclusions table 或其他东西,但这里有一个查询可以做到这一点并根据要求排除 "The Kingdom of the Crystal Skull":
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 Fiddle: http://sqlfiddle.com/#!3/fc62e/14
http://sqlfiddle.com/#!3/3ec1f/119
这是我的 fiddle...我希望结果看起来像这样,但我使用的查询不这样做:
我的查询问题是我似乎无法使用 exclusion_flag 条件排除 "The Kingdom of the Crystal Skull"。我也不知道为什么 Contract 3 (Raiders of the Lost Arc) 似乎也没有出现。我已经为此苦苦挣扎了几个小时,但不知道问题出在哪里。我尝试查看子查询,但我不确定这是否是解决方案...
那里有几个 questions/issues 所以我会尝试单独解决它们。
1) 您不能使用 exclusion_flag 排除 "The Kingdom of the Crystal Skull" 因为 contract_sid 7 和 8 都引用 product_list_sid 3 其中包括 "The Kingdom of the Crystal Skull" -如果您想要一份排除它的合同,则需要创建一个单独的 product_list_sid。
2) "Raiders of the Lost Arc" (contract_sid 3) 未显示,因为它是 "single product" 合同,您的查询仅使用 product_list_join 从范围加入 product_list_id - contract_sid 3 在 product_sid 列中,因此您需要一个单独的连接来满足使用 product_sid 而不是 product_list_sid 的合同(我假设合同不能同时使用)。这是一个非常狡猾的架构设计,但这里有一个解决该问题的查询。请注意使用 LEFT OUTER JOIN 表示正在连接的 table 可能不包含任何行(例如,当 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
编辑:发布此消息后,我意识到您实际上在尝试做什么 - 范围 table 不仅提供了合同的详细信息,还提供了要从合同中排除的特定产品。同样,这是糟糕的架构设计,应该有一个单独的 scope_exclusions table 或其他东西,但这里有一个查询可以做到这一点并根据要求排除 "The Kingdom of the Crystal Skull":
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 Fiddle: http://sqlfiddle.com/#!3/fc62e/14