标签: select

如何在一次选择中获得当前和下一个更大的值?

我有一个带有列的 InnoDB 表“idtimes”(MySQL 5.0.22-log)

`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
Run Code Online (Sandbox Code Playgroud)

使用复合唯一键

UNIQUE KEY `id_time` (`id`,`time`)
Run Code Online (Sandbox Code Playgroud)

所以每个 id 可以有多个时间戳,每个时间戳可以有多个 id。

我正在尝试设置一个查询,在其中获取所有条目以及每个条目的下一个更大时间(如果存在),因此它应该返回,例如:

+-----+------------+------------+
| id  | time       | nexttime   |
+-----+------------+------------+
| 155 | 1300000000 | 1311111111 |
| 155 | 1311111111 | 1322222222 |
| 155 | 1322222222 |       NULL |
| 156 | 1312345678 | 1318765432 |
| 156 | 1318765432 |       NULL |
+-----+------------+------------+
Run Code Online (Sandbox Code Playgroud)

现在我到目前为止:

SELECT l.id, l.time, r.time FROM 
    idtimes AS l LEFT JOIN idtimes …
Run Code Online (Sandbox Code Playgroud)

mysql innodb select

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

为什么在 SQL Server 中“select *”比“select top 500 *”快?

我有一个观点,complicated_view-- 有一些连接和 where 子句。现在,

select * from complicated_view (9000 records)
Run Code Online (Sandbox Code Playgroud)

更快,更快,比

select top 500 * from complicated_view
Run Code Online (Sandbox Code Playgroud)

我们说的是 19 秒对 5+ 分钟。

第一个查询返回所有 9000 条记录。如何只获得前 500 名的时间长得可笑?

显然,我将在这里查看执行计划 ---- 但是一旦我弄清楚为什么SQL Server 以次优方式运行“前 500”,我该如何实际告诉它以快速方式运行计划,喜欢坐满桌?

当然,我可能不得不完全重写视图——但很奇怪。

基本上,我将此数据表连接到第 3 方软件,该软件使用select top 500 *无法修改的默认查询预先检查表。因此,除了将此视图转储到实际表中(非常草率)之外,我也无法绕过他们的“前 500 名”附录。

这是 SQL Server 2012。

编辑:不同意重复标志。另一个问题,顶部比所有的都快。这将是预期的行为,返回较少的行。我的情况正好相反。另外,我的理解是 Top 100 是一种与 Top 100+ 不同的算法。我什至不认为重复的问题有正确的答案。也就是说,TOP X 查询将在很早的时候对潜在的大量表进行排序,而不是在它们被聚合/过滤/等之后。为什么是一个谜,但如何显然存在。

performance sql-server execution-plan select top query-performance

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

即使零行匹配,也让 SELECT 返回一个常量值

考虑这个选择语句:

SELECT *, 
       1 AS query_id 
FROM players 
WHERE username='foobar';
Run Code Online (Sandbox Code Playgroud)

它返回query_id带有值的列1以及玩家的其他列。

如何将一个至少让上面的SQL回报query_id1,即使选择,反而找不到行那场比赛?

顺便说一句,它是 PostgreSQL 8.4。

postgresql null select

18
推荐指数
2
解决办法
9万
查看次数

SELECT TOP 1 from a very large table on a index column 非常慢,但不是反向顺序(“desc”)

我们有一个大约 1TB 的大型数据库,在强大的服务器上运行 SQL Server 2014。几年来,一切都运行良好。大约 2 周前,我们进行了全面维护,其中包括: 安装所有软件更新;重建所有索引和压缩 DB 文件。但是,我们没想到在某个阶段,在实际负载相同的情况下,DB 的 CPU 使用率会增加超过 100% 到 150%。

经过大量的故障排除,我们将其缩小到一个非常简单的查询,但我们找不到解决方案。查询非常简单:

select top 1 EventID from EventLog with (nolock) order by EventID
Run Code Online (Sandbox Code Playgroud)

它总是需要大约 1.5 秒!但是,使用“desc”的类似查询总是需要大约 0 毫秒:

select top 1 EventID from EventLog with (nolock) order by EventID desc
Run Code Online (Sandbox Code Playgroud)

PTable 大约有 5 亿行;EventIDASC数据类型为 bigint(身份列)的主聚集索引列(ordered )。顶部有多个线程向表中插入数据(较大的 EventID),底部有 1 个线程删除数据(较小的 EventID)。

在 SMSS 中,我们验证了两个查询始终使用相同的执行计划:

  • 聚集索引扫描;

  • 估计行数和实际行数均为1;

  • 估计和实际执行次数均为1;

  • 估计I/O成本是8500(好像有点高)

  • 如果连续运行,则两者的查询成本相同 50%。

我更新了索引统计with fullscan,问题依旧;我再次重建索引,问题似乎消失了半天,但又回来了。

我打开了 IO 统计:

set statistics io on …
Run Code Online (Sandbox Code Playgroud)

performance sql-server select sql-server-2014 top query-performance

17
推荐指数
1
解决办法
4713
查看次数

使用 WITH 的多个操作

有没有办法使用WITH语句执行多个操作?

就像是

WITH T AS
(
  SELECT * FROM Tbl
)
BEGIN
  OPEN P_OUTCURSOR FOR
    SELECT * FROM T;

  SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;
Run Code Online (Sandbox Code Playgroud)

我想选择一些数据和它的计数...

oracle cte select

16
推荐指数
2
解决办法
3万
查看次数

递归自联接

我有一张comments表,可以简化为:

comments
=======
id
user_id
text
parent_id
Run Code Online (Sandbox Code Playgroud)

where 可以parent_id为空,但可能是其父注释的键。


现在,我如何才能select对特定评论的所有后代?
评论可能低了好几层……

mysql join foreign-key select

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

CREATE TABLE ... AS SELECT 中的自动增量主键

我通过一个复杂的选择查询创建了表CREATE TABLE ... AS SELECT...。如何在此查询中添加自动增量主键?

例如:

create table `user_mv` select `user`.`firstname` as 
   `firstname`,
   `user`.`lastname` as `lastname`,
   `user`.`lang` as `lang`,
   `user`.`name` as `user_name`,
   `group`.`name` as `group_name`
from `user`
  inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`)
  left  join `group` on (`group`.`group_id`=`user_groups`.`group_id`)
where `user`.`lang`=`group`.`lang` 
Run Code Online (Sandbox Code Playgroud)

此查询创建一个包含firstname, lastname, lang, username,group_name列的表。我希望它也有一个id作为自动增量主键的列。

有没有办法通过更改此查询来做到这一点?我知道我可以通过在执行此查询后更改表来做到这一点,但是如果有任何方法可以直接在create table语句中执行此操作,我想知道如何执行此操作。

mysql primary-key auto-increment select ctas

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

术语“投影”在 SQL 查询(或视图定义)中指的是什么

在 Oracle 的文档The Query Optimizer 中,在View Merging 下,我找到了以下信息

视图合并优化适用于仅包含选择、投影和连接的视图。也就是说,可合并视图不包含集合运算符、聚合函数、DISTINCT、GROUP BY、CONNECT BY 等。 (强调我的)

然而,我只能猜测这样的投影实际上指的是什么。

oracle select

15
推荐指数
2
解决办法
3万
查看次数

为什么一定要从双表中选择?

这适用于最有可能出现在 StackOverflow/dba.stackexchange 上的主要关系数据库管理系统,包括SQL Server、MySQL、PostgreSQL 和 SQLite (WebSQL)

select 'abc' abc, 1 def;
Run Code Online (Sandbox Code Playgroud)

它不适用于 Oracle。为什么我们需要在Oracle中选择DUAL?SQL 的 ISO/ANSI 标准是否要求SELECT语句的 FROM 子句?


编辑:

根据Bacon Bit的回答,它似乎是 SQL 标准所要求的。

所以实际上,因为名称 DUAL 用词不当,如果我要创建一个表并将其命名为 ATOM 或 ONE,例如create table one (atom int);.. select 'abc' abc, 1 def FROM one;- 与 相比是否有性能损失SELECT .. FROM DUAL

oracle select

15
推荐指数
2
解决办法
6498
查看次数

选择下一行和上一行

我有下表:

CREATE TABLE post (
  id            bigint primary key,
  thread_id     bigint,
  is_notice     boolean,
  title         text,
  content       text
)
Run Code Online (Sandbox Code Playgroud)

我使用以下查询显示列表:

SELECT * FROM post ORDER BY is_notice desc, thread_id desc, id
Run Code Online (Sandbox Code Playgroud)

然后,给定由 id(ie SELECT * FROM post where id=3)选择的帖子,我如何检索下一个和上一个帖子?

postgresql select

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