【问题标题】: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

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

【问题讨论】:

    标签: sql sql-server view


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2022-09-29
    相关资源
    最近更新 更多