我遇到一种情况,我需要能够查看给定的人是否在用户/经理层次结构中。
我需要能够根据一组规则为一组用户执行此操作(不用担心这一点,只是为了给它一些背景信息)
理想情况下,我想在 where 子句的相关存在子查询中使用递归 CTE。
但这会带来很多问题..
我想我想做的是:
WITH UserHierarchy(UserId, ManagerId)
AS
(
--Anchor Definition
SELECT [UserId], [ManagerId] FROM [Users] WHERE [ManagerId] = [Rules].[RuleAddedByUserId] -- this needs to bind to an outer query....
UNION ALL
--Recursive Member definiation
SELECT [Users].[UserId], [Users].[ManagerId] FROM [Users]
INNER JOIN [UserHierarchy] ON [Users].[ManagerId] = [UserHierarchy].[UserId]
WHERE [Users].[UserId] <> [Users].[ManagerId] --don't recurse if the anchor definition matches itself (to avoid an infinate loop).
)
Run Code Online (Sandbox Code Playgroud)
无论如何,是否可以在兼容模式 …
sql recursion sql-server-2005 common-table-expression correlated-subquery
尝试在 SQL Server 2008 中保存视图时,出现“关键字‘OPTION’附近的语法不正确”错误。我尝试将 MAXRECURSION 选项添加到公用表表达式的末尾。我见过的所有示例以及我之前创建的工作 CTE 都不介意 CTE 末尾的“选项(MAXRECURSION 0)”。
有人知道我为什么会收到此错误吗?CTE 在没有 OPTION 子句的情况下工作,尽管它达到了最大递归数 (100)。
WITH CTE AS
(
SELECT
CDay,
InvAcct,
BuyerCode,
PartNumber,
ROP,
ROP_ROQ,
DailyDemand,
StartingInvQty,
SchedDeliveryQty,
CAST(StartingInvQty - DailyDemand/2.0 AS decimal(18,4)) AS ProjInvQty
FROM
qryInventorySimulation
WHERE
MBC = 'B' AND
CDay = CAST(CAST(GETDATE()AS date) as datetime)
UNION ALL
SELECT
qryInventorySimulation.CDay,
qryInventorySimulation.InvAcct,
qryInventorySimulation.BuyerCode,
qryInventorySimulation.PartNumber,
qryInventorySimulation.ROP,
qryInventorySimulation.ROP_ROQ,
qryInventorySimulation.DailyDemand,
qryInventorySimulation.StartingInvQty,
qryInventorySimulation.SchedDeliveryQty,
CAST(CTE.ProjInvQty + qryInventorySimulation.SchedDeliveryQty - qryInventorySimulation.DailyDemand AS decimal(18,4)) AS ProjInvQty
FROM
qryInventorySimulation INNER JOIN CTE ON qryInventorySimulation.InvAcct = …Run Code Online (Sandbox Code Playgroud) SELECT TOP ...在Postgres 中描述查询的大多数资源都说你应该使用LIMIT,ORDER BY如果需要通过某种顺序选择顶部元素,可能使用子句.
你会怎么做,如果你需要选择一个递归查询,那里是没有排序的前N个元素和有可能的查询可以在不递归返回N多行少(这样TOP的部分是必要的,以确保结果set 至少是 N行,而LIMIT可以允许更少的行)?
我的具体用例是动态SQL模式的修改,用于选择表的随机子样本.
这是我修改的sql源的链接.最简单的方法是查看那里定义的最终函数_random_select.它紧跟上述链接,但在输入表和输出结果集中已经被修改为多态,并且正确地说明了只返回输入表中已经存在的列的需要(还有另一个动态SQL)黑客row_number从最终结果集中排除中期结果).
这是一个眼睛,但它是我最接近可重复的例子.如果您使用_random_select并尝试从大于4500行的表中获取大约4500行的内容,则会开始以较高的概率看到较小的结果集,并且只会随着您增加所需样本的大小而变得更糟(因为重复的出现随着你想要的样本变大,情况会变得更糟)
请注意,在我的修改中,我没有使用_gaps此链接中的技巧,如果某个索引列中存在间隙,则意味着过度采样以抵消采样效率低下.那部分与这个问题无关,在我的情况下,我row_number用来确保有一个整数列,没有可能的间隙.
CTE的是递归的,以确保如果CTE的第一,非递归部分不给你足够的行(因为被去除重复的UNION),那么它会回去经过一轮又一轮的CTE的递归调用,并继续坚持更多的结果,直到你有足够的.
在链接的示例中,LIMIT使用,但我发现这不起作用.该方法返回的结果较少,因为最多LIMIT只能保证N行.
你如何获得至少 N行保证?选择TOPN行似乎是执行此操作的自然方式(因此递归CTE必须保持一直持续直到它获得足够的行来满足TOP条件),但这在Postgres中不可用.
sql postgresql recursive-query common-table-expression sql-limit
我正在尝试使用 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) 我正在将一些 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 生成的值填充它吗?
所以我在 PostgreSQL 10 中有这个简单的查询。
with bunch_of_things as (
select vans_id from shoes where adidas_id = 1
)
select * from vans where vans.id in (bunch_of_things) ;
Run Code Online (Sandbox Code Playgroud)
我收到错误column "bunch_of_things" does not exist
我知道我可以将第一个选择放在第二个查询的括号内,以定义 IN 部分
但由于我将在同一事务中多次使用第一个查询的结果,因此我不想多次执行相同的查询。
那么如何才能让 IN 与 CTE 一起工作呢?
(如果这是不可能的,我怎样才能获得一次查询结果并在事务中多次使用它们?)
谢谢
postgresql transactions common-table-expression sql-in postgresql-10
我有以下 SQLAlchemy 表:
\n\n\n\nfrom sqlalchemy.ext.declarative import declarative_base\n\nBase = declarative_base()\n\nclass NetworkLink(Base):\n """Network immediate link between a franchisee and his franchisor\n\n """\n __tablename__ = \'network_link\'\n\n id_franchisee = Column(Integer, ForeignKey(\'user.id\'), primary_key=True)\n id_franchisor = Column(Integer, ForeignKey(\'user.id\'))\nRun Code Online (Sandbox Code Playgroud)\n\n它基本上代表了一个树状的网络结构。
\n\n给定特许人的 id,我需要获取整个子树中所有后代的 id。\n例如,如果表如下:
\n\nid_franchisor | id_franchisee \n1 | 2\n1 | 3\n2 | 4\n2 | 5\n4 | 6\nRun Code Online (Sandbox Code Playgroud)\n\n然后给定 id 1 我需要 1,2,3,4,5,6,而给定 2 我需要 2,4,5,6。
\n\n我知道这不是解决此问题的最有效的表表示形式,但此操作将很少执行,并且插入将更加常见。
\n\n我正在尝试使用递归查询来实现此功能,如下所示:
\n\n"""\nWITH RECURSIVE recursive_franchisee(id) AS\n(\n SELECT %s\n UNION ALL\n SELECT L.id_franchisee\n FROM recursive_franchisee …Run Code Online (Sandbox Code Playgroud) 问题
我使用这种技术#Table_1为 CTE中表中的每一行生成一个随机数。然后我将 CTE 的结果加入到另一个表 上。我不是为 中的每一行获取随机数,而是为连接中的每个结果行获取一个新的随机数!#Table_2#Table_1
CREATE TABLE #Table_1 (Id INT)
CREATE TABLE #Table_2 (MyId INT, ParentId INT)
INSERT INTO #Table_1
VALUES (1), (2), (3)
INSERT INTO #Table_2
VALUES (1, 1), (2, 1), (3, 1), (4, 1), (1, 2), (2, 2), (3, 2), (1, 3)
;WITH RandomCTE AS
(
SELECT Id, (ABS(CHECKSUM(NewId())) % 5)RandomNumber
FROM #Table_1
)
SELECT r.Id, t.MyId, r.RandomNumber
FROM RandomCTE r
INNER JOIN #Table_2 t
ON r.Id = t.ParentId
Run Code Online (Sandbox Code Playgroud)
结果
Id MyId …Run Code Online (Sandbox Code Playgroud) 我有一个带有父/子层次结构的表,支持多个(理论上无限)级别的嵌套:
|------|-------------------|-------------|
| id | title | parent_id |
|------|-------------------|-------------|
| 1 | Dashboard | 0 |
| 2 | Content | 0 |
| 3 | Modules | 0 |
| 17 | User Modules | 3 |
| 31 | Categories | 17 |
| ... | | |
|------|-------------------|-------------|
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建一个查询,生成每个项目的父项的串联列表,直到树中的最高父项:
|------|----------------------|
| id | concatenatedParents |
|------|----------------------|
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 17 | 3,0 | …Run Code Online (Sandbox Code Playgroud) mysql sql recursive-query common-table-expression hierarchical-data
我正在尝试在 Postgresql 12 中创建 SP:
CREATE OR REPLACE PROCEDURE trans_buy(
_name_client varchar(25),
_id_product smallint,
_mount smallint
)
LANGUAGE plpgsql
AS
$$
BEGIN
INSERT INTO invoices (cliente) VALUES(_name_client);
INSERT INTO invoices_details (id_invoice, id_product, mount) VALUES (1, _id_product, _mount, 100);
END
$$
Run Code Online (Sandbox Code Playgroud)
但是当我尝试像这样调用这个 sp 时:
CALL trans_buy('james', 3, 10)
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
不存在存储过程<< trans_buy(未知,整数,整数)>>
提示:没有过程与参数的名称和类型匹配。可能需要添加显式类型转换。
sql postgresql stored-procedures common-table-expression sql-insert
sql ×7
postgresql ×4
database ×1
mysql ×1
php ×1
python ×1
random ×1
recursion ×1
sql-in ×1
sql-insert ×1
sql-limit ×1
sql-server ×1
sqlalchemy ×1
transactions ×1
upsert ×1