标签: sql-cte

EFCore 中的 CTE(公用表表达式)

我的数据库中有一个表,用于存储位置的层次结构。它有 3 列(Id, Name, ParentId)。我需要根据条件加载一些行以及它们的所有父行直到根。如果是在 ADO 中,我会使用以下语句。

with Temp
as
(
    select * from Locations where Name like '%filter%'

    union all

    select Locations.* 
    from Temp join Locations on Temp.ParentId = Locations.Id
)
select * from Temp
Run Code Online (Sandbox Code Playgroud)

我正在使用 EFCore,并通过一些搜索发现实体框架如何与递归层次结构一起工作?Include() 似乎不适用于它 如何使用实体框架进行递归加载?还有一堆其他的,他们都老了。

我发现的所有解决方案要么对层次结构的深度进行硬编码(使用Include),要么在 C# 中进行递归。所有这些,我的问题是最好的解决方案是什么?

我可以使用FromSqlRaw (类似下面的代码),但是我不喜欢在 C# 中手动编写查询。

    var locations = DataContext.Locations
    .FromSqlRaw("MyQuery").ToList();
Run Code Online (Sandbox Code Playgroud)

我在用EFCore 3.1.7

sql-server recursion hierarchy sql-cte entity-framework-core

10
推荐指数
1
解决办法
5044
查看次数

使用SQL CTE打印树

架构如下:

CREATE TABLE [Structure](
    [StructureId] [uniqueidentifier] NOT NULL,
    [SequenceNumber] [int] NOT NULL, -- order for siblings, unique per parent
    [ParentStructureId] [uniqueidentifier] NULL,
 CONSTRAINT [Structure_PK] PRIMARY KEY CLUSTERED 
(
    [StructureId] ASC
)
) ON [PRIMARY]

ALTER TABLE [Structure]  WITH CHECK ADD  CONSTRAINT [Structure_FK1] 
FOREIGN KEY([ParentStructureId])
REFERENCES [Structure] ([StructureId])
Run Code Online (Sandbox Code Playgroud)

目前,我可以通过以下CTE获取所有逻辑数据,但我想以深度优先的方式直接打印它.

WITH SCTE (StructureId, Level, Seq, ParentId)
AS
(
  SELECT StructureId,  0, SequenceNumber, [ParentStructureId]
    FROM Structure
    WHERE [ParentStructureId] IS NULL 
          AND StructureId = 'F6C5F016-1270-47C1-972F-349C32DFC92A'

  UNION ALL

  SELECT Structure.StructureId, Level + 1, SequenceNumber, ParentStructureId …
Run Code Online (Sandbox Code Playgroud)

sql-server tree sql-cte

8
推荐指数
1
解决办法
5275
查看次数

使用CTE在自引用表中递归删除行.这个过程是如何进行的?

我正在研究一个辅助项目,为了在自引用表中删除一行及其所有后代,我在触发器中使用这样的递归CTE:

CREATE TRIGGER dbo.tr_Comment_Delete
    ON dbo.Comment INSTEAD OF DELETE
AS
    ;WITH IDs AS (
       SELECT id FROM DELETED
       UNION ALL
       SELECT c.id
       FROM Comment AS c INNER JOIN IDs AS i 
        ON c.parent_comment_id = i.id
    )
    DELETE FROM Comment
    WHERE id IN (SELECT id FROM IDs);
GO
Run Code Online (Sandbox Code Playgroud)

这是自引用表

在此输入图像描述

虽然我有这个代码按预期工作,但这是你做某事的情况之一,但你不太确定它是如何工作的.

更确切地说,我想知道的是,通过使用这种递归CTE(ID),当我尝试删除具有子注释的注释时,我能够避免引用完整性错误吗?

删除评论的过程/顺序是什么?

以此评论层次为例:

3-> 8-> 13 
Run Code Online (Sandbox Code Playgroud)

这里,id 3的注释是根注释.评论8是对评论3的回复,就像评论13是对评论8的回复一样.

删除过程实际上是如何进行的?

PS我尝试添加一个表格,我在计算时插入了ID.不幸的是我无法理解它.这些是这样的表的结果:

id  ins-date
3   2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
Run Code Online (Sandbox Code Playgroud)

sql-server triggers recursive-query sql-cte

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

SQL - 使用多个 CTE 创建视图

我要创建一个视图,其中有 2 个 CTES。这就是我在下面所做的。第一部分很好,但是在“AND”之后事情就不起作用了。感谢您的意见

CREATE VIEW dbo.VW.SPAg
AS With today as 
(SELECT * FROM dbo.Work_Days
 WHERE [Date] = CAST(GETDATE() AS DATE)
)

AND WITH rd as
(SELECT [DATE] AS REP_DATE
 FROM dbo.Link_Days
 WHERE DAY ([DATE]) = 1
)
SELECT wm *,
gr.DATE_ORDINAL AS Goods_Rcvd_Ordinal
gt.DATE_ORDINAL AS Goods_Trnpt_Ordinal
today.DATE

FROM dbo.SPAg sg
INNER JOIN rd
  ON YEAR(sg.Client_Query)= YEAR(rd.REP_DATE)
LEFT JOIN dbo.Work_DAYS gr
ON sg.Goods_Rcvd = gr.[DATE]
LEFT JOIN dbo.Work_DAYS gt
ON sg.Goods_Trnpt = gt.[DATE]
Run Code Online (Sandbox Code Playgroud)

sql sql-view sql-cte

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