我有一个产品表和一个小部件表。
产品是由多个小部件构建的,我有一个链接表,它显示了哪些小部件被链接到哪个产品。
可以将小部件标记为expired
,这意味着它们没有资格被添加到任何新产品中。
模式和示例数据在以下sqlFiddle中-
我需要一个查询,根据以下规则显示特定产品的所有合格小部件:
'selected'
。我得到了以下可以工作的查询,并满足上述所有规则:
select
data.WidgetName,
data.expired,
case
when data.ID in (select data_id from Widget_link where productId = 1)
then 1
else 0
end as selected
from Widget_data data
left outer join Widget_link link
on data.ID = link.data_id and data.expired = 1
where (data.expired = 0 or (data.expired = 1 and link.productId = 1))
我想找到一种将查询的select部分中的子查询重构为某种联接的方法。我正在尝试创建一个视图,我可以使用where
子句进行筛选,而不是在两个地方使用productId
。这个是可能的吗?
发布于 2016-04-08 02:47:29
简化后,您的查询完全可以基于下面的联接进行评估,并且根本不需要内部查询。
select data.WidgetName,
case when link.id is not null then 1 else 0 end as selected
from Widget_data data
left outer join Widget_link link
on data.ID = link.data_id and link.productId = 1
where data.expired=0 or link.id is not null
发布于 2016-04-08 02:48:15
可以使用通用表表达式覆盖选择列表的结果,并在单个SQL语句中使用。
您甚至可以在代码中创建具有多个CTE的SQL语句。
我的建议可以从视觉上概括如下
WITH cte AS (
SELECT ..... FROM .....
),
other_cte AS (
SELECT ..... FROM .....
)
SELECT *
FROM cte
INNER JOIN other_cte ON...
https://stackoverflow.com/questions/36497410
复制相似问题