首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将select语句中的子查询重构为联接

将select语句中的子查询重构为联接
EN

Stack Overflow用户
提问于 2016-04-08 10:33:24
回答 2查看 1.2K关注 0票数 2

我有一个产品表和一个小部件表。

产品是由多个小部件构建的,我有一个链接表,它显示了哪些小部件被链接到哪个产品。

可以将小部件标记为expired,这意味着它们没有资格被添加到任何新产品中。

模式和示例数据在以下sqlFiddle中-

我需要一个查询,根据以下规则显示特定产品的所有合格小部件:

  1. 如果小部件标记为过期,则不应显示它。
  2. 作为上述规则的例外--如果小部件标记为过期,但已经链接到产品,则应该显示它。
  3. 如果小部件已经链接到产品,则应将其标记为'selected'

我得到了以下可以工作的查询,并满足上述所有规则:

代码语言:javascript
运行
复制
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。这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-08 10:47:29

简化后,您的查询完全可以基于下面的联接进行评估,并且根本不需要内部查询。

代码语言:javascript
运行
复制
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

演示SQL小提琴

票数 4
EN

Stack Overflow用户

发布于 2016-04-08 10:48:15

可以使用通用表表达式覆盖选择列表的结果,并在单个SQL语句中使用。

您甚至可以在代码中创建具有多个CTE的SQL语句

我的建议可以从视觉上概括如下

代码语言:javascript
运行
复制
WITH cte AS (
  SELECT ..... FROM .....
),
other_cte AS (
  SELECT ..... FROM .....
)
SELECT * 
FROM cte
INNER JOIN other_cte ON...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36497410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档