标签: common-table-expression

EntityFramework中的公用表表达式

我在Sql Server中有这个查询,我需要在EntityFramework中使用,那么如何编写一个与此结果相同的EntityFramwork代码

WITH    cte AS
        (
        SELECT  *
        FROM    StockGroups
        WHERE   GroupParent ='Stationery' 
        UNION ALL
        SELECT  g.*
        FROM    StockGroups g
        JOIN    cte
        ON      g.GroupParent = cte.GroupName
        )
SELECT  *
FROM    cte
Run Code Online (Sandbox Code Playgroud)

我不知道如何在EF中转换它,所以我尝试使用join.

from a in db.StockGroups
join b in db.StockGroups on new { GroupParent = a.GroupParent } equals new { GroupParent = b.GroupName }
where
  b.GroupName == "Stationery"
select new {
  a.GroupName,
  a.GroupParent,
  Column1 = b.GroupName,
  Column2 = b.GroupParent
}
Run Code Online (Sandbox Code Playgroud)

但结果并不像CTE一样递归.

.net c# linq common-table-expression entity-framework-4

7
推荐指数
3
解决办法
8383
查看次数

使用SQL CTE表来包含路径和所有子项

我有以下分层树表

GO
DROP TABLE #tbl 
GO
CREATE TABLE #tbl (Id int , ParentId int)
INSERT  INTO #tbl (Id, ParentId) VALUES  (0, NULL)
INSERT  INTO #tbl (Id, ParentId) VALUES  (1, 0)
INSERT  INTO #tbl (Id, ParentId) VALUES  (2, 1)
INSERT  INTO #tbl (Id, ParentId) VALUES  (3, 1)
INSERT  INTO #tbl (Id, ParentId) VALUES  (4, 2)
INSERT  INTO #tbl (Id, ParentId) VALUES  (5, 2)
INSERT  INTO #tbl (Id, ParentId) VALUES  (6, 3)
INSERT  INTO #tbl (Id, ParentId) VALUES  (7, 3)
GO
Run Code Online (Sandbox Code Playgroud)

哪个映射到后面的树 …

sql sql-server common-table-expression

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

使用SQL进行二进制搜索查询

我有一个在SQL Server 2014表中呈现的二叉树:

UserID ParentUserID Position 
----------------------------
1      Null         Null     <-- ROOT
2      1            Left
3      1            Right    <-- Last Right for ID=1 (CTE query return 3)
4      2            Left
5      4            Left
6      5            Left
7      6            Left     <-- Last Left for ID=1 (CTE query return 6)
Run Code Online (Sandbox Code Playgroud)

要获得最后一个id和最后一个id我正在使用CTE查询:

; with  left_hand_recurse as
(
        select  UserID
        ,       ParentUserID
        ,       1 as depth
        from    Table1 where ParentUserID is null
        union all
        select  child.UserID
        ,       child.ParentUserID
        ,       parent.depth + 1
        from    left_hand_recurse …
Run Code Online (Sandbox Code Playgroud)

sql t-sql database sql-server common-table-expression

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

使用PERFORM CTE查询Postgres plpgsql

我试着在下面的代码示例中模拟我的问题.在下面的代码中,我正在执行select * from test一个过程.我们知道,我们必须使用perform关键字.这非常有效:

perform * from test;
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将该简单查询重写为CTE,我无法使其正常工作.我收到语法错误.

with test_as_cte as(select * from test) perform * from test_as_cte;
Run Code Online (Sandbox Code Playgroud)

这可能吗?什么是正确的语法?我尝试了几种替代方案并通过文档,但到目前为止没有任何成功.

(请注意,这只是解释我的问题的一个例子.我知道查询没有任何意义.)

create table test
(
    key int primary key  
);

create function test() returns trigger as
$$
begin
    raise notice 'hello there';
    -- this does work
    perform * from test;
    -- this doesn't work
    with test_as_cte as(select * from test) perform * from test_as_cte;
    return new;
end;
$$
language plpgsql;

create trigger test after insert on …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql common-table-expression database-trigger

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

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

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

SQLITE查询结果到临时表

我之前没有使用SQLite过,也无法弄清楚语法,SQL Server如果它有帮助,我有这个工作.

我需要将结果放入临时表中,以便重用它们.

// SQL Server

WITH FT_CTE AS
(
SELECT pID, cID FROM brFTNode_Children 
WHERE pID = 1
UNION ALL
    SELECT e.pID, e.cID FROM brFTNode_Children e
    INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)
)
SELECT * INTO #ParentChild FROM FT_CTE;
Run Code Online (Sandbox Code Playgroud)

// SQLite试试

WITH FT_CTE AS
(
SELECT pID, cID FROM brFTNode_Children 
WHERE pID = 1
UNION ALL
    SELECT e.pID, e.cID FROM brFTNode_Children e
    INNER JOIN FT_CTE ftCTE on (ftCTE.cID = e.pID)
)
CREATE TEMPORARY …
Run Code Online (Sandbox Code Playgroud)

sqlite create-table common-table-expression

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

将多个 INSERTS 插入一张表和多对多表

我正在尝试使用 PostgreSQL 数据库在 PHP 中开发一个问答网站。我有一个操作来创建一个具有标题、正文、类别和标签的页面。我设法插入了所有这些字段,但是在插入多个标签值时遇到了一些问题。

我使用这个函数将逗号分隔的值放入一个数组中,现在我想要将每个数组元素插入到表上的数据库中(避免重复),tags然后插入到我的多对多关系表中questiontags

$tags = explode(',', $_POST['tags']); //Comma separated values to an array
Run Code Online (Sandbox Code Playgroud)

它打印出这样的东西:

Array ( [0] => hello [1] => there [2] => this [3] => is [4] => a [5] => test )
Run Code Online (Sandbox Code Playgroud)

动作/create_question.php

$category = get_categoryID_by_name($_POST['category']);

$question = [
    'userid' => auth_user('userid'),
    'body' => $_POST['editor1'],
    'title' => $_POST['title'],
    'categoryid' => $category
];

create_question($question, $tags);
Run Code Online (Sandbox Code Playgroud)

然后我create_question应该在哪里插入标签。

function create_question($question, $tags) {

    global $conn;
    $query_publications=$conn->prepare("SELECT * FROM insert_into_questions(:body, :userid, :title, :categoryid); …
Run Code Online (Sandbox Code Playgroud)

php database postgresql upsert common-table-expression

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

自上而下的树postgres的递归路径聚合和CTE查询

我正在尝试编写一个查询,以生成给定根的树中所有节点的列表,以及路径(使用父级给他们孩子的名称)到达那里的路径.我工作的递归CTE是直接来自这里的文档的教科书CTE ,然而,事实证明在这种情况下使路径工作很困难.

在git模型之后,由于遍历树创建的路径,父母会将名称提供给子级.这意味着映射到git的树结构等子id.

我一直在网上寻找递归查询的解决方案,但它们似乎都包含使用父ID或物化路径的解决方案,这些都会破坏Rich Hickey的数据库作为价值谈话的结构共享概念.

目前的实施

想象一下,对象表很简单(为简单起见,我们假设整数id):

drop table if exists objects;
create table objects (
    id INT,
    data jsonb
);

--       A
--     /   \
--    B     C
--   /   \    \
--  D     E    F

INSERT INTO objects (id, data) VALUES
  (1, '{"content": "data for f"}'),  -- F
  (2, '{"content": "data for e"}'),  -- E
  (3, '{"content": "data for d"}'),  -- D
  (4, '{"nodes":{"f":{"id":1}}}'),               -- C
  (5, '{"nodes":{"d":{"id":2}, "e":{"id":3}}}'), -- B
  (6, …
Run Code Online (Sandbox Code Playgroud)

postgresql recursive-query common-table-expression

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

在 Redshift 中使用 CTE 和更新

我正在将一些 SQL 逻辑从 SSMS 中使用的 T-SQL 转换为 Amazon Redshift。我相信 Redshift 是 Postgres 8.0.2 版的一个分支,所以除非使用 Postgres 9.1,否则下面的内容可能是不可能的。

WITH CTE_ID AS 
(
SELECT FULL_NAME, COUNT(DISTINCT ID) as ID_COUNT, MAX(ID) AS MAX_ID
FROM MEMBERS
GROUP BY FULL_NAME
HAVING COUNT(DISTINCT ID) > 1
)
UPDATE a
SET a.ID = b.MAX_ID
FROM MEMBERS a
INNER JOIN CTE_ID b
ON a.FULL_NAME = b.FULL_NAME
Run Code Online (Sandbox Code Playgroud)

如果 Amazon Redshift 不支持此功能,我的最佳选择是创建一个新的“临时”表并用 CTE 生成的值填充它吗?

sql common-table-expression amazon-redshift

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