如何从一张表中获得我想要的视图结果

Posted

技术标签:

【中文标题】如何从一张表中获得我想要的视图结果【英文标题】:How to get my desired view result from one table 【发布时间】:2016-12-04 17:32:22 【问题描述】:

我有一个表(mytable),如下例所示,其中包含任何集合都有的项目:

CollCode | ItemCode
---------+---------
   101   |   201
   101   |   202
   101   |   203
   202   |   204
   202   |   205

我想从这个表中取回一个视图,结果是这样的:

CollCode | ItemCode
---------+----------
   101   |   201
   101   |   202
   101   |   203
   101   |   204
   101   |   205
   202   |   204
   202   |   205

这意味着我想要所有级别的集合的所有项目,而不仅仅是第一级。

【问题讨论】:

【参考方案1】:

您正在寻找递归 CTE。试试这个:

with t(CollCode, ItemCode) as (
       values (101, 201), (101, 202), (101, 203),
              (202, 204), (202, 205)
      ),
      cte as (
       select t.CollCode, t.ItemCode
       from t
       union all
       select cte.CollCode, t.ItemCode
       from cte join
            t
            on t.collCode = cte.ItemCode
      )
select *
from cte
order by collCode;

(很明显,CTE t 只是为了提供示例数据来证明这是可行的。)

编辑:

要删除中间结果:

select *
from cte
where not exists (select 1 from t t2 where t2.collCode = cte.ItemCode)
order by collCode;

【讨论】:

我有点困惑。请按照说明给我创建所需视图的代码。 @AAAE_N 只需在 SQL 之前添加“create view my_view_name as”即可。 @arturro 上面代码中带有示例数据的 t 表怎么样。我的表有一千多条记录。 @AAAE_N 只需将 t 替换为您的表并将其从 sql 中删除: create view my_view as with cte as ( select CollCode, ItemCode from my_table union all select cte.CollCode, my_table.ItemCode from cte join my_table on my_table.collCode = cte.ItemCode ) select * from cte order by collCode; 感谢 @arturro 和 Gordon Linoff

以上是关于如何从一张表中获得我想要的视图结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询只从一张表中拉取数据

MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?

sql语句 怎么从一张表中查询数据插入到另一张表中

oracle中从一张表中筛选出不再多个时间段内的时间

根据查找值将值从一张表匹配并粘贴到另一张表中

从一张表中选择不同的值并限制它们