嗨说我有一张桌子:
Person:
PersonId
Name
ManagerId
Run Code Online (Sandbox Code Playgroud)
所以ManagerId是一个回复给另一个人的参考.
所以数据库中可能有人:
1
Bob
null
2
Steve
1
3
Tim
2
Run Code Online (Sandbox Code Playgroud)
所以鲍勃是史蒂夫的经理而史蒂夫是蒂姆的经理.
所以我想要做的就是编写一个查询,让Bob管理下的所有人.直接或间接.所以我想要得到史蒂夫和蒂姆.在同一条线上.
如果我写:
select * from Person
where ManagerId = 1 I would get only Steve.
Run Code Online (Sandbox Code Playgroud)
我怎么写它所以我直接或间接地让每个人都在Bob下?
我正在尝试将Postgres中的函数转换为select我打算用作视图的查询.原因是我想通过select带有where子句的查询从客户端访问它,而不是像使用函数那样使用参数.该表表示树(和邻接列表),定义如下:
CREATE TABLE tree (
id serial primary key,
parent_id int references tree(id)
);
INSERT INTO tree (id, parent_id) VALUES
(1,null)
, (2,1), (3,2), (4,3), (5,3)
, (6,5), (7,6), (8,4), (9,8)
, (10,9), (11,9), (12,7)
, (13,12), (14,12), (15,11)
, (16,15), (17,16), (18,14)
, (19,13), (20,19), (21,20);
SELECT setval ('tree_id_seq', 21); -- reset sequence
-- This produces a tree like:
-- +-- <10>
-- /
-- +-- <4> -- <8> --- <9> -+- <11> …Run Code Online (Sandbox Code Playgroud) 所以,我刚刚发现SQL Server 2008不允许您在定义中使用CTE索引视图,但它允许您在视图定义中alter添加查询with schemabinding.有这么好的理由吗?出于某种原因我不知道是否有意义?我的印象是,WITH SCHEMABINDING主要目的是允许您索引视图
新的和改进的更多查询操作
;with x
as
(
select rx.pat_id
,rx.drug_class
,count(*) as counts
from rx
group by rx.pat_id,rx.drug_class
)
select x.pat_id
,x.drug_class
,x.counts
,SUM(c.std_cost) as [Healthcare Costs]
from x
inner join claims as c
on claims.pat_id=x.pat_id
group by x.pat_id,x.drug_class,x.counts
Run Code Online (Sandbox Code Playgroud)
以及创建索引的代码
create unique clustered index [TestIndexName] on [dbo].[MyView]
( pat_id asc, drug_class asc, counts asc)
Run Code Online (Sandbox Code Playgroud) 我正在使用Postgres 9.3构建一个数据库作为后端,有3个表:
table1 (user_id, username, name, surname, emp_date)
table2 (pass_id, user_id, password)
table3 (user_dt_id, user_id, adress, city, phone)
Run Code Online (Sandbox Code Playgroud)
可以看出table2并且table3是儿童表table1.
我可以user_id在table1(父)中提取新插入的行:
INSERT INTO "table1" (default,'johnee','john','smith',default) RETURNING userid;
Run Code Online (Sandbox Code Playgroud)
我需要将新提取的id(from table1)插入到这些表的唯一user_id列中table2以及table3其他数据中.基本上3 X INSERT ......
我该怎么做?
SQLite 3.8.3增加了对CTE的支持.我在这个页面上尝试了一些示例CTE,它们工作正常.但是,在阅读文档并尝试调整一些示例后,我无法创建简单的测试.
首先,我创建一个包含两个字段的简单表:id和parent.这将创建一个简单的树或链接的记录列表:
CREATE TABLE test(id INTEGER PRIMARY KEY ASC,parent INTEGER);
Run Code Online (Sandbox Code Playgroud)
现在我用几行填充它:
INSERT INTO test (parent) VALUES (NULL);
INSERT INTO test (parent) VALUES (1);
INSERT INTO test (parent) VALUES (2);
INSERT INTO test (parent) VALUES (3);
Run Code Online (Sandbox Code Playgroud)
之后我有一个看起来像这样的表:
---+-------
id | parent
---+-------
1 | NULL
2 | 1
3 | 2
4 | 3
Run Code Online (Sandbox Code Playgroud)
现在我想生成沿3和1之间路径的行列表:
WITH RECURSIVE test1(id,parent) AS (
VALUES(3,2)
UNION ALL
SELECT * FROM test WHERE test.parent=test1.id)
SELECT * FROM …Run Code Online (Sandbox Code Playgroud) 根据https://cwiki.apache.org/confluence/display/Hive/Common+Table+Expression, 我发现HIVE支持CTE.但是,我在尝试执行简单的CTE时遇到以下错误
An error occurred while calling o60.sql.
: java.lang.StackOverflowError
at java.lang.ThreadLocal.set(ThreadLocal.java:201)
Run Code Online (Sandbox Code Playgroud)
尝试以下查询以获取目标节点的所有父项时,我收到此错误
nodelist = sqlContext.sql("""
SELECT node,src from known
""")
nodelist.registerTempTable("nodelist")
pathcalc = sqlContext.sql("""
WITH nodeMaster
AS ( SELECT p.node,
p.src
FROM nodelist p
WHERE p.node = """+dest+"""
UNION ALL
SELECT c.node,
c.src
FROM nodeMaster cte
INNER JOIN nodelist c ON c.node = cte.src
)
SELECT node
FROM nodeMaster m
""")
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序服务多级权限和角色
我有这个HIERARCHY:
国家
....区域
........市
............协会
................中央
....................学校
........................类
这个HIERARCHY我把它命名为"EntityLevels"
| ID | Name | ParentID |
|----|-------------|----------|
| 1 | Country | Null |
| 2 | Region | 1 |
| 3 | City | 2 |
| 4 | Association | 3 |
| 5 | Center | 4 |
| 6 | School | 5 |
| 7 | Class | 6 |
Run Code Online (Sandbox Code Playgroud)
我还有一个群组表,这意味着乔布斯
| ID | Name | EntityLevels |
|----|--------------------|--------------|
| 1 | CountryAdmins …Run Code Online (Sandbox Code Playgroud) sql-server recursive-query common-table-expression hierarchical-data
我知道锚是必要的,这是有道理的.而且我知道需要a UNION ALL,如果你的递归CTE没有,它只是不起作用......但我找不到一个很好的解释为什么会这样.所有文档都只是声明你需要它.
为什么我们不能在递归查询中使用a UNION而不是a UNION ALL?似乎不要在重复递归时包含重复项是个好主意,不是吗?我想,这样的东西应该已经在幕后工作了.
我有一个具有同级排序的树层次结构。我需要添加对其他树的引用。
这是数据:
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) 我必须执行涉及多个深度连接和复杂谓词的相对复杂的查询,其中结果(和条件)取决于满足条件的合适条目。涉及主要和次要标准,始终应用主要标准,如果结果不令人满意,则进行次要打击。简而言之
但如果没有足够的不同文档类型或不同客户的文档,请尝试仍然满足 N 个文档的数量
我选择声明式(查询)方法而不是命令式(游标和计数器)。这就是该WITH子句的用武之地。粗略地说,通过使用多个WITH块(CTE),我声明查询(我喜欢将它们视为临时视图)来为两种文档类型声明两个不同的目标集。最后,我将UNION不同 CTE 的子集作为最终结果,并执行一些COUNT检查来限制数量。
COUNT例如,多个 CTE 相互引用,并从上下文中的多个位置引用NOT EXISTS。我是SQL新手,WITH机缘巧合之下就选择了使用它。这是 的正确用例WITH还是反模式?与以命令式方式使用游标和计数器实现相同功能相比,该解决方案的性能如何?我是否选择了错误的方法?我们正在讨论具有数百万个条目的表。
这是整个查询。请原谅,由于保密原因,我不得不隐藏这些字段。
WITH target_documents AS (
SELECT
<Necessary fields>
FROM documents l
WHERE
<Suitable document criteria>
),
target_documents_type_1 AS (
SELECT * FROM target_documents WHERE type = 1
),
target_documents_type_2 AS (
SELECT * FROM target_documents WHERE type = 2
),
target_customers AS (
SELECT
<Necessary fields>
FROM customers …Run Code Online (Sandbox Code Playgroud) sql ×7
recursion ×3
sql-server ×3
t-sql ×3
postgresql ×2
sqlite ×2
apache-spark ×1
hive ×1
insert ×1
oracle ×1
performance ×1
pyspark ×1
tree ×1
view ×1