我在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一样递归.
我有以下分层树表
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 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) 我试着在下面的代码示例中模拟我的问题.在下面的代码中,我正在执行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) 我有一种情况,我需要配置现有的客户端数据,以解决我们的应用程序没有正确更新表中的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) 我正在跑步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)
我知道我做的很糟糕.
希望你能从上面的查询中了解到我想要实现的目标.
所以请为它提出任何替代方法.
回复非常感谢.
注意:实际查询
我之前没有使用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) 我正在尝试使用 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) 我正在尝试编写一个查询,以生成给定根的树中所有节点的列表,以及路径(使用父级给他们孩子的名称)到达那里的路径.我工作的递归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) 我正在将一些 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 ×5
postgresql ×4
sql-server ×3
database ×2
.net ×1
c# ×1
create-table ×1
linq ×1
php ×1
plpgsql ×1
recursion ×1
sqlite ×1
t-sql ×1
upsert ×1