标签: common-table-expression

“存在”相关子查询中递归 CTE 的替代方案?

我遇到一种情况,我需要能够查看给定的人是否在用户/经理层次结构中。

我需要能够根据一组规则为一组用户执行此操作(不用担心这一点,只是为了给它一些背景信息)

理想情况下,我想在 where 子句的相关存在子查询中使用递归 CTE。

但这会带来很多问题..

  1. 我认为您根本不能在子查询中使用 CTE。
  2. 我使用兼容模式 80 的 SQL 2005 - 所以我不能使用交叉应用...所以对我来说 UDF 中没有列参数:-(

我想我想做的是:

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

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

CTE 语句中关键字“OPTION”附近的语法不正确

尝试在 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)

sql common-table-expression sql-server-2008

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

如何保证Postgres中递归CTE至少返回N行

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

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

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

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

在 PostgreSQL 中将 CTE 与 IN 结合起来

所以我在 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

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

SQLAlchemy简单递归cte查询

我有以下 SQLAlchemy 表:

\n\n\n\n
from 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\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

它基本上代表了一个树状的网络结构。

\n\n

给定特许人的 id,我需要获取整个子树中所有后代的 id。\n例如,如果表如下:

\n\n
id_franchisor | id_franchisee \n1 | 2\n1 | 3\n2 | 4\n2 | 5\n4 | 6\n
Run 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)

python sqlalchemy recursive-query common-table-expression

6
推荐指数
0
解决办法
8708
查看次数

如何获得 CTE 中生成的随机数,使其在 JOIN 中不发生更改?

问题

我使用这种技术#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)

sql sql-server random common-table-expression

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

MySQL-递归列出表中所有项目的所有父项和祖先

我有一个带有父/子层次结构的表,支持多个(理论上无限)级别的嵌套:

|------|-------------------|-------------|
|  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

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

PostgreSQL - 如何使用 varchar 参数调用过程

我正在尝试在 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

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