标签: common-table-expression

"With"关键字在SQL中如何工作?

这么多次见过with,很多次SQL Server都问;过它

;with ...工作怎么样?

;with coords(...) as (
SELECT * ...
)
Run Code Online (Sandbox Code Playgroud)

为什么必须;在它之前?

sql common-table-expression sql-server-2008

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

使用递归公用表表达式从两个表中查找连续的no.s

我有以下表格:

Actual         Optional
------         --------
4                 3
13                6
20                7
26                14
                  19
                  21
                  27
                  28
Run Code Online (Sandbox Code Playgroud)

我要做的是选择:

1)"实际"表中的所有值.

2)如果它们形成具有"实际"表值的连续系列,则从"可选"表中选择值

预期的结果是:

Answer
------
4
13
20
26
3    --because it is consecutive to 4 (i.e 3=4-1) 
14   --14=13+1
19   --19=20-1
21   --21=20+1
27   --27=26+1
28   --this is the important case.28 is not consecutive to 26 but 27 
     --is consecutive to 26 and 26,27,28 together form a series.
Run Code Online (Sandbox Code Playgroud)

我使用递归cte编写了一个查询但是它永远循环并且在递归达到100级后失败.我遇到的问题是27场比赛26场比赛,27场比赛27场比赛27场比赛27场比赛28场比赛27场比赛......(永远)

这是我写的查询:

with recurcte as
        (
        select num as one,num as two from …
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursive-query common-table-expression sql-server-2008

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

TSQL GROUP BY在递归CTE中

是否有解决方法在循环CTE中使用GROUP BY或有解决方法?

我需要对CTE表的结果集进行分组,并在具有相同CTE的另一个循环中使用它,但是我得到以下错误:

递归公用表表达式"cte"的递归部分中不允许使用GROUP BY,HAVING或聚合函数.

这是查询:

WITH cte
    AS
    (
        SELECT
          id,
          dailyconsumption,
          stock/dailyconsumption as cutoff
        FROM items
        WHERE father IS NULL


        UNION ALL

        SELECT
          i.id,
          SUM(father.dailyconsumption*i.num),
          MAX(stock)/SUM(father.dailyconsumption*i.num)
        FROM cte father
        JOIN items i ON father.id=i.father
        group by i.id
    )

SELECT id, MIN(cutoff)
FROM cte
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

SQL-Fiddle(带有示例数据)


编辑......这是合乎逻辑的问题

我有一组最终用户项(父= NULL)和其他一些子项(由字段父和字段num填充).我只为最终用户项目获得了每日消费(我用"WHERE father IS NULL"开始我的cte),并且子项的dailyconsumption由SUM(father.dailyconsumption*item.num)计算.

WITH cte AS(
    SELECT
      id,
      dailyconsumption,
      stock/dailyconsumption as cutoff
    FROM items
    WHERE father IS NULL


    UNION ALL

    SELECT
      i.id,
      father.dailyconsumption*i.num
      0
    FROM cte father …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server common-table-expression

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

使用 Ruby on Rails 进行 Postgres 公共表表达式查询

我试图找到在 Rails 应用程序中使用通用表表达式进行 Postgres 查询的最佳方法,因为我知道 ActiveRecord 显然不支持 CTE。

我有一个名为的表user_activity_transitions,其中包含一系列正在启动和停止的用户活动的记录(每行指状态的更改:例如启动或停止)。

一个地方user_activity_id可能有很多对开始停止的情侣,它们位于不同的两排。如果活动当前正在进行并且尚未停止,则也可能只有“已开始”。第sort_key一个状态从 0 开始,每次状态更改时增加 10。

id      to_state     sort_key     user_activity_id    created_at
1       started      0            18                  2014-11-15 16:56:00
2       stopped      10           18                  2014-11-15 16:57:00
3       started      20           18                  2014-11-15 16:58:00
4       stopped      30           18                  2014-11-15 16:59:00
5       started      40           18                  2014-11-15 17:00:00
Run Code Online (Sandbox Code Playgroud)

我想要的是以下输出,将开始-停止的对组合在一起,以便能够计算持续时间等。

user_activity_id     started_created_at      stopped_created_at
18                   2014-11-15 16:56:00     2014-11-15 16:57:00
18                   2014-11-15 16:58:00     2014-11-15 16:59:00
18                   2014-11-15 17:00:00     null
Run Code Online (Sandbox Code Playgroud)

表的实现方式使得运行该查询变得更加困难,但对于未来的更改(例如新的中间状态)更加灵活,因此不会进行修改。

我的 Postgres 查询(以及 Rails 中的相关代码):

query = …
Run Code Online (Sandbox Code Playgroud)

postgresql ruby-on-rails common-table-expression rails-activerecord

7
推荐指数
2
解决办法
5368
查看次数

使用 RECURSIVE 查询来选择最长的路径

WITH RECURSIVE我是PostgreSQL 的新手。我有一个相当标准的递归查询,它遵循邻接列表。如果我有,例如:

1 -> 2
2 -> 3
3 -> 4
3 -> 5
5 -> 6
Run Code Online (Sandbox Code Playgroud)

它产生:

1
1,2
1,2,3
1,2,3,4
1,2,3,5
1,2,3,5,6
Run Code Online (Sandbox Code Playgroud)

我想要的是:

1,2,3,4
1,2,3,5,6
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在 Postgres 中做到这一点。这似乎是“选择最长的路径”或“选择不包含在另一条路径中的路径”。我也许可以看到如何通过连接本身来做到这一点,但这似乎效率很低。

一个示例查询是:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
   SELECT g.id, g.link, g.data, 1, ARRAY[g.id], false
   FROM graph g
  UNION ALL
   SELECT g.id, g.link, g.data, sg.depth + 1, path || g.id, g.id = ANY(path)
   FROM graph g, search_graph sg
   WHERE g.id = sg.link AND NOT cycle …
Run Code Online (Sandbox Code Playgroud)

sql postgresql directed-graph recursive-query common-table-expression

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

postgresql在单个查询中更新多个表

我有2个表格如下:

  1. serial_table

    id CHARACTER VARYING(20),
    serial_key CHARACTER VARYING(20),
    PRIMARY KEY(id, serial_key)
    
    Run Code Online (Sandbox Code Playgroud)
  2. serial_rate:

    id CHARACTER VARYING(20), 
    serial_key CHARACTER VARYING(20),
    rate NUMERIC,
    PRIMARY KEY(id, serial_key),
    FOREIGN KEY (id, serial_key) REFERENCES serial_table(id, serial_key)
    
    Run Code Online (Sandbox Code Playgroud)

现在我想更新serial_rate.rateserial_table.serial_key从单个SQL查询更新,如:

UPDATE inventory.serial_table AS s 
JOIN inventory.serial_rate AS r 
ON (s.id, s.serial_key) = (r.id, r.serial_key) 
SET s.serial_key = '0002', r.rate = 22.53
WHERE (s.id, s.serial_key) = ('01', '002');
Run Code Online (Sandbox Code Playgroud)

我知道的是不正确的.是否有可能这样做,因为我想使用该语句PreparedStatement在Java中创建?

编辑 这个问题PreparedStatements与Java 无关这是关于我想在创建时作为参数传递的SQL语法PreparedStatement.我不想要任何答案PreparedStatement.

sql postgresql common-table-expression sql-update

7
推荐指数
2
解决办法
8251
查看次数

从两个时间戳创建一个 PostgreSQL `tsrange`

我正在尝试tsrange在 postgresql 查询中创建一个(上周四到上周四),但出现转换错误。

这就是我到目前为止所得到的(从这个 SO question 开始)。

WITH past_week AS (
    SELECT date_trunc('day', NOW() + (s::TEXT || ' day')::INTERVAL)::TIMESTAMP(0) AS day 
    FROM generate_series(-7, 0, 1) AS s)
SELECT (
date_trunc('day', (SELECT day FROM past_week WHERE EXTRACT(DOW FROM day) = '4') - '7 day'::INTERVAL),
date_trunc('day', (SELECT day FROM past_week WHERE EXTRACT(DOW FROM day) = '4')));
Run Code Online (Sandbox Code Playgroud)

这是结果(正确的值,但不是格式,因为它不是一个范围):

                      row                      
-----------------------------------------------
 ("2015-10-29 00:00:00","2015-11-05 00:00:00")
(1 row)
Run Code Online (Sandbox Code Playgroud)

现在,有两个主要问题困扰着我:

  1. 如果我尝试::tsrange在查询结束之前添加一个right ,解释器会抱怨:

    错误:无法将类型记录转换为 tsrange 第 6 行:...ROM 过去一周 WHERE EXTRACT(DOW FROM …

postgresql range common-table-expression

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

我是否使用 CTE 或事务来组合查询?PostgreSQL

文档说:

事务:事务的本质是将多个步骤捆绑到一个单一的、全有或全无的操作中。步骤之间的中间状态对于其他并发事务不可见,并且如果发生阻止事务完成的某些故障,则所有步骤都不会影响数据库。

数据修改 CTE:这允许您在同一查询中执行多个不同的操作...WITH 中的子语句彼此并发执行并与主查询并发执行。因此,当在WITH中使用数据修改语句时,指定更新实际发生的顺序是不可预测的

我的需求:

  • 全有或全无的操作;
  • 不嵌套查询;
  • 回归;
  • 了解它们之间的区别以及在哪里使用它们。

示例:看下面的设计。当我 CRUD 数据时,我应该在这里使用什么?我的请求应该是什么样的?

数据库设计

sql postgresql transactions common-table-expression

7
推荐指数
0
解决办法
2330
查看次数

SQLAlchemy:如何执行多个独立的 CTE?

我的工作 SQL 代码有两个 CTE,其中之一必须与主语句并行工作,如下所示:

WITH RECURSIVE cte1 AS (...get initial rows...),
cte2 AS (...select rows from cte1 and insert in table1 in parallel to main statement...)
INSERT INTO table2 (...) SELECT ... FROM cte1;
Run Code Online (Sandbox Code Playgroud)

我在 SQLAlchemy 的帮助下为所有部分编写代码:

cte1 = select(...).cte('cte1', recursive=True)
cte2 = table1.insert().from_select([...], select(...here i use cte1...)).cte('cte2')
result = table2.insert().from_select([...], select(...here i use cte1 too...))
Run Code Online (Sandbox Code Playgroud)

但是我不能在我的查询中插入 cte2,因为我没有在结果语句中使用它,而且我找不到以其他方式包含 cte2 的方法......欢迎任何建议。谢谢。

python sqlalchemy common-table-expression

7
推荐指数
0
解决办法
221
查看次数

计算 MySQL 中列的简单中位数

我正在努力寻找一个简单的中值问题的解决方案。my_table给定一个只有一列的表:

my_column | 
----------|
10        |
20        |
30        |
40        |
50        |
60        |
Run Code Online (Sandbox Code Playgroud)

如何调用函数返回中位数 35?

当我只想返回中值时,我不知道如何使此语法起作用:

SELECT
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
  my_table
Run Code Online (Sandbox Code Playgroud)

mysql sql median common-table-expression mariadb

7
推荐指数
2
解决办法
7616
查看次数