标签: common-table-expression

SQL Server 2008 CTE递归

我试图执行我认为使用CTE是SQL Server 2008的艰难递归.我似乎无法绕过这一个.

在下面的例子中,您可以假定固定深度为3 ......任何东西都不会低于此值.在现实生活中,深度"更深"但仍然固定.在这个例子中,我试图简化一些.

我的输入数据如下所示.

ID     PARENT_ID       NAME          DEPTH
------------------------------------------
1      NULL            A             1
2      1               B             2
3      2               C             3
4      1               D             2
Run Code Online (Sandbox Code Playgroud)

我的CTE的输出应该是下表.

LEVEL1_ID    LEVEL2_ID    LEVEL3_ID    LEVEL1_NAME    LEVEL2_NAME    LEVEL3_NAME
--------------------------------------------------------------------------------
1            NULL         NULL         A              NULL           NULL
1            2            NULL         A              B              NULL
1            2            3            A              B              C
1            4            NULL         A              D              NULL
Run Code Online (Sandbox Code Playgroud)

如果我可以在输出中获取ID列,我当然可以映射到查找表中的名称.

我也愿意采用其他方式来实现这一目标,包括使用SSIS.

sql common-table-expression sql-server-2008

6
推荐指数
1
解决办法
4020
查看次数

递归CTE以查找父记录

首先,我必须承认我不太熟悉sql server的递归CTE,但我认为这是最好的方法.

我有一张桌子tabData.它的PK被命名,idData并且有一个自引用FK fiData.

架构

因此,fiData引用父记录并SELECT * FROM tabData WHERE idData=fiData返回父记录的所有数据.这很简单快捷.但是如何让自然顺序中的所有父母从特定记录中获取?假设有一个子节点(idData = 4)有3个父节点(第一个父节点是idData = 3的记录):

idData    fiData 
 4          3     
 3          2     
 2          1    
 1          NULL    
Run Code Online (Sandbox Code Playgroud)

我认为递归CTE是要走的路,但我的语法并不好.那么实现返回所有父母的CTE的正确方法是什么?

我试过跟随,但它给了我错误的结果(3,4而不是3,2,1):(为了测试它我为你和你创建了一个临时表)

IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND  TABLE_NAME = 'tabData_Temp'))
BEGIN
 CREATE TABLE [dbo].[tabData_Temp](
  [idData] [int] NOT NULL,
  [fiData] [int] NULL,
   CONSTRAINT [PK_tabData_Temp] PRIMARY KEY CLUSTERED 
  (
   [idData] ASC
  )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …
Run Code Online (Sandbox Code Playgroud)

sql recursion sql-server-2005 common-table-expression

6
推荐指数
2
解决办法
6089
查看次数

使用AS从CTE中选择?SQL Server 2008

我正在尝试将PostgreSQL转换为SQL Server.但是这个查询不起作用.

我究竟做错了什么?我尝试在WITH之前添加分号但没有运气.

   SELECT 
      member_a AS you, member_b AS mightknow, shared_connection,
      CASE
         WHEN (n1.member_job_country = n2.member_job_country AND n1.member_job_country = n3.member_job_country) THEN 'country in common'
         WHEN (n1.member_unvan_id = n2.member_unvan_id AND n1.member_unvan_id = n3.member_unvan_id) THEN 'unvan in common'
         ELSE 'nothing in common'
      END AS reason
   FROM (
      WITH transitive_closure(member_a, member_b, distance, path_string, direct_connection) AS
        (SELECT 
             member_a, member_b, 1 AS distance,
             CAST(member_a as varchar(MAX)) + '.' + CAST(member_b as varchar(MAX)) + '.' AS path_string,
             member_b AS direct_connection
         FROM Member_Contact_Edges
         WHERE member_a = 45046 …
Run Code Online (Sandbox Code Playgroud)

sql common-table-expression sql-server-2008

6
推荐指数
1
解决办法
9053
查看次数

PostgreSQL通过2个父/子表递归递归

我想为树木育种项目创建一个线性祖先列表.父母是男性/女性对,不得相关(没有近亲繁殖),因此追踪和可视化这些血统的重要性......

下面是使用Postgresql 9.1的测试表/数据:

DROP TABLE if exists family CASCADE;
DROP TABLE if exists plant CASCADE;

CREATE TABLE family (   
  id serial,
  family_key VARCHAR(20) UNIQUE,
  female_plant_id INTEGER NOT NULL DEFAULT 1,  
  male_plant_id INTEGER NOT NULL DEFAULT 1,   
  filial_n INTEGER NOT NULL DEFAULT -1,  -- eg 0,1,2...  Which would represent None, F1, F2... 
  CONSTRAINT family_pk PRIMARY KEY (id)
);

CREATE TABLE plant ( 
  id serial,
  plant_key VARCHAR(20) UNIQUE,
  id_family INTEGER NOT NULL,  
  CONSTRAINT plant_pk PRIMARY KEY (id),
  CONSTRAINT plant_id_family_fk FOREIGN KEY(id_family) REFERENCES …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query common-table-expression

6
推荐指数
1
解决办法
1810
查看次数

SQL递归逻辑

我有一种情况,我需要配置现有的客户端数据,以解决我们的应用程序没有正确更新表中的ID的问题.

这是场景.我们有一个父表,可以插入行来有效地替换现有行; 替换可以是递归的.我们还有一个子表,它有一个指向父表的字段.在现有数据中,子表可能指向已替换的行,我需要更正它.我不能简单地将每一行更新为替换行,因为行也可以被替换,我需要反映最新的行.

我试图找到一种方法来编写一个可以为我完成此操作的CTE,但我很难找到一个能够找到我实际需要的查询的查询.这是我正在使用的表格的示例; 考虑到某些行的递归替换,'ShouldBe'列是我想要的最终更新查询.

DECLARE @parent TABLE (SampleID int, 
                   SampleIDReplace int,
                   GroupID char(1))

INSERT INTO @parent (SampleID, SampleIDReplace, GroupID)
VALUES (1, -1, 'A'), (2, 1, 'A'), (3, -1, 'A'), 
       (4, -1, 'A'), (5, 4, 'A'), (6, 5, 'A'),
       (7, -1, 'B'), (8, 7, 'B'), (9, 8, 'B')


DECLARE @child TABLE (ChildID int, ParentID int)
INSERT INTO @child (ChildID, ParentID)
VALUES (1, 4), (2, 7), (3, 1), (4, 3)
Run Code Online (Sandbox Code Playgroud)

应用更新脚本后,子表中的所需结果:

ChildID     ParentID    ParentID_ShouldBe
1           4           6 (4 replaced …
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursion common-table-expression

6
推荐指数
1
解决办法
901
查看次数

查询以递归方式识别对象依赖项

我有一个复杂的查询,其中包含几个表,视图和函数.函数和视图分离为更多视图和函数,这些视图和函数可能会拆分为更多视图和函数.

此查询存在性能问题,因此我希望得到一个清晰简明的列表,列出我的查询中引用的所有对象,以便为调查提供依据.如何获取此对象列表?

sql-server dependencies common-table-expression

6
推荐指数
2
解决办法
7261
查看次数

PostgreSQL:如何在CTE中更新行

我正在跑步PostgreSQL 9.2.
下面给出的是我巨大而丑陋的样本query

with cte as(
select ....... from aTable 
),cte1 as (
select ..... from bTable inner join cte using(anID)
),update_cte as(
update cte set aField=(select somthing from cte1)
)
select * from cte
Run Code Online (Sandbox Code Playgroud)


我需要创建一个view最终结果.

执行上述操作时会出现以下错误.

ERROR:  relation "cte" does not exist
Run Code Online (Sandbox Code Playgroud)

我知道我做的很糟糕.
希望你能从上面的查询中了解到我想要实现的目标.
所以请为它提出任何替代方法.

回复非常感谢.

注意:实际查询

sql postgresql common-table-expression

6
推荐指数
1
解决办法
2341
查看次数

在CTE中返回存储的结果

我能否将存储的proc调用到CTE中。我登录到仅RO的报告数据库。我对我们的UAT具有写权限,但想查询实时数据。

那么我可以在CTE中使用存储的proc吗?

with clientOwes as (
  exec des_Batch_GetApplicationClientOwesList
)     
select a.des_applicationnumber 
from des_heapplicationset a 
where a.des_heapplicationid in (select applicationid from clientowes)
Run Code Online (Sandbox Code Playgroud)

结果是:消息156,级别15,状态1,第3行关键字'exec'附近的语法错误。

sql-server stored-procedures common-table-expression

6
推荐指数
1
解决办法
4562
查看次数

ORACLE中的CTE和表更新

在我最终通过更新表中的列来存储结果之前,我想要运行许多复杂的逻辑.我收到一个错误,并且能够将其归结为:

with my_cte as
(
  select x,ix from y
)
update z
set mycol = (select x from my_cte where z.ix = my_cte.ix)
Run Code Online (Sandbox Code Playgroud)

然而,这给出了错误:

Error at line 4:
ORA-00928: missing SELECT keyword
set mycol = (select x from my_cte where z.ix = my_cte.ix)
Run Code Online (Sandbox Code Playgroud)

这是否意味着CTE不能与更新一起使用,因为以下查询工作正常:

update z
set mycol = (select x from y where y.ix = my_cte.ix)
Run Code Online (Sandbox Code Playgroud)

使用12c企业版12.1.0.2.0版

编辑:

解决这个问题一段时间后,获得合理性能的唯一方法是使用MERGE子句(仍然使用CTE,如下面的答案).

merge into z using (
  with my_cte as (
    select x,ix from y
  )
)
on (
  my_cte.ix = z.ix …
Run Code Online (Sandbox Code Playgroud)

sql oracle common-table-expression

6
推荐指数
1
解决办法
6192
查看次数

SQL Server CTE循环; 将所有记录一起插入

我有这种情况:

drop table #t1;
drop table #t2

select * 
into #t1
from
    (select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va1'c1,'vb1'c2,'vc1'c3 union all
     select 'va2'c1,'vb2'c2,'vc2'c3 union all
     select 'va3'c1,'vb3'c2,'vc3'c3 union all
     select 'va4'c1,'vb4'c2,'vc4'c3) t

select *
into #t2
from #t1
where 0 = 1

;with tmp1 as
(
    select 
        t1.*,
        ROW_NUMBER() …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server common-table-expression recursive-cte

6
推荐指数
1
解决办法
215
查看次数