标签: 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-server dependencies common-table-expression

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

在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
查看次数

从同一个表中的逗号分隔列更新行列

我有以下表定义

CREATE TABLE _Table 
(
    [Pat] NVARCHAR(8), 
    [Codes] NVARCHAR(50), 
    [C1] NVARCHAR(6), 
    [C2] NVARCHAR(6), 
    [C3] NVARCHAR(6), 
    [C4] NVARCHAR(6), 
    [C5] NVARCHAR(6)
);
GO

INSERT INTO _Table ([Pat], [Codes], [C1], [C2], [C3], [C4], [C5])
VALUES
    ('Pat1', 'U212,Y973,Y982', null, null, null, null, null),
    ('Pat2', 'M653', null, null, null, null, null), 
    ('Pat3', 'U212,Y973,Y983,Z924,Z926', null, null, null, null, null);
GO  
Run Code Online (Sandbox Code Playgroud)

SQL小提琴在这里.

现在,我想分割每行的代码并填充Cn列,以便最终得到

Pat     Codes                       C1      C2      C3      C4      C5
Pat1    'U212,Y973,Y982'            U212    Y973    Y982    NULL    NULL
Pat2    'M653'                      M653    NULL    NULL    NULL    NULL …
Run Code Online (Sandbox Code Playgroud)

sql t-sql common-table-expression sql-server-2012

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

With子句:嵌套树

我有一个具有同级排序的树层次结构。我需要添加对其他树的引用。

这是数据:

drop table if exists org; CREATE TABLE org(id int primary key, name text, boss int, sibling int, ref int) without rowid;
INSERT INTO org VALUES(0, 'Alice', NULL, null, null);
INSERT INTO org VALUES(1, 'Bob', 0, null, null);
INSERT INTO org VALUES(2, 'Cindy', 0, 1, null);
INSERT INTO org VALUES(3, 'Dave', 1, 4, 7);
INSERT INTO org VALUES(4, 'Emma', 1, null, null);
INSERT INTO org VALUES(5, 'Fred', 2, null, null);
INSERT INTO org VALUES(6, 'Gail', 2, 5, null);
INSERT …
Run Code Online (Sandbox Code Playgroud)

sql sqlite common-table-expression

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