小编ype*_*eᵀᴹ的帖子

即使在指定索引提示后,对临时表的选择查询也没有以正确的顺序返回数据

在我的代码中,我使用select * into #tempTable. 临时表包含大量记录,我需要在代码中多次从中检索数据,因此我在其上创建了聚集索引。但不知何故,我没有按照创建的索引以正确的顺序获取数据。

我知道我可以简单地通过放置order by子句来做到这一点,但我的问题是为什么即使我强制优化器使用特定索引,我也没有以正确的顺序获取数据?

下面是我的示例代码:

----------- Sample code ----------------------------

;with CTE1
as (
    select col1
        ,col2
        ,-- - -- - - from table1

    union

    select col1
        ,col2
        ,-- - -- - - from table2
        -- few more tables in union --
    )
    , CTE2
as (
    select *
        ,RowNumber = RowNumber() 
            over (order by case 
                    when @sortOrder = 0
                    then case 
                            when @sortColumn = 'Date'
                            then [tdate]......some more dynamic order by conditions..........
                         end …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

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

使用 IF 插入重复密钥更新

我有sy_version一个有 2 列主键的表(mod_id, sub_mod)::

CREATE TABLE `sy_version` (
`mod_id` VARCHAR(2) NOT NULL,
`sub_mod` VARCHAR(30) NOT NULL,
`version` VARCHAR(50) NULL DEFAULT NULL,
`remark` VARCHAR(50) NULL DEFAULT NULL,
`update_date` DATETIME NULL DEFAULT NULL,
`download_link` VARCHAR(50) NULL DEFAULT NULL,
`file` BLOB NULL,
PRIMARY KEY (`mod_id`, `sub_mod`)
)COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

我的数据是

CS;sbm_sl.exe;2015.11.01;IBS Sales App;2015-11-10 11:34:13;\N;0x73002E00000000
Run Code Online (Sandbox Code Playgroud)

我想使用 更新我的数据insert into on duplicate key,首先它工作正常。但是每次我执行时,我都会得到我的file列变成,我想要的结果是:当我想要设置的版本大于当前(原始)版本时,NULL文件变成。NULL命令如下:

INSERT INTO sbm_sys.sy_version (mod_id,sub_mod,`version`,remark,update_date,file) 
values ('CS','sbm_sl.exe','2015.11.07.1','IBS Sales App','2015-11-10 11:34:13', NULL) 
ON DUPLICATE …
Run Code Online (Sandbox Code Playgroud)

mysql

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

PostgreSQL (PostGIS) 和 SQL Server (Spatial) 的结果差异

我有两点,我必须计算它们之间的差异。

我在 SQL Server 中使用以下查询。

SELECT geography::Point(27.185425, 88.124582, 4326)
       .STDistance(geography::Point(27.1854258, 88.124500, 4326));
Run Code Online (Sandbox Code Playgroud)

它运行良好,结果是:

8.12599260290125
Run Code Online (Sandbox Code Playgroud)

现在,当我在 PostgreSQL 中运行以下查询时,同样的情况。

SELECT ST_Distance(ST_GeomFromText('POINT(27.185425 88.124582)',4326),
                   ST_GeomFromText('POINT(27.1854258 88.124500)', 4326));
Run Code Online (Sandbox Code Playgroud)

现在结果是:

8.20039023523232
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么计算两点之间的距离时结果存在差异?

postgresql sql-server spatial postgis

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

不推荐使用 SQL 文本数据类型?

我已经读到 Microsoft SQL Server 已弃用text数据类型而支持varchar(max).

PostGreSQL 已经允许varchar(没有长度)作为text.

问题是,ANSI SQL 标准对弃用text和最佳替代方案有何看法?另外,MySQL/MariaDB 是否也遵循这一点?

谢谢

mysql postgresql sql-server sql-standard

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

max(max(col1), max(col2), ...) 不起作用

我有一个包含三个整数列的表:

select max(col1), max(col2), max(col3) from mytable
Run Code Online (Sandbox Code Playgroud)

我想要三列的最大值。但这不起作用:

select max(max(col1), max(col2), max(col3)) from mytable
Run Code Online (Sandbox Code Playgroud)

如何完成这项工作?

我使用 PostgreSQL,但我希望这可以用标准 SQL 解决。

postgresql max

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

postgresql GROUP BY 和最新日期按非 group by 语句过滤?

目前我有下表:

CREATE TABLE demo (
  id SERIAL PRIMARY KEY,
  key TEXT NOT NULL,
  other_key TEXT NOT NULL,
  quantity BIGINT NOT NULL,
  date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);
Run Code Online (Sandbox Code Playgroud)

现在我想按这样的查询进行分组:

SELECT other_key, SUM(quantity) FROM demo GROUP BY other_key;       
Run Code Online (Sandbox Code Playgroud)

到目前为止,效果很好,但是现在我想按键过滤并打印date表的最新信息,有什么好的方法吗?

伪(将失败,因为密钥不在分组依据中)

SELECT other_key, SUM(quantity), MAX(date) FROM demo GROUP BY other_key WHERE key = ?;    
Run Code Online (Sandbox Code Playgroud)

我最初的想法是子查询:

SELECT other_key, SUM(quantity), MAX(date) FROM (SELECT * FROM demo WHERE key = ?) GROUP BY other_key;
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?那么什么是该表的良好索引呢?

我当前的索引是:

CREATE INDEX demo_all_idx ON …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

从 Windows 迁移到 Linux

我计划将 SQL Server 2008 标准版迁移到 Linux 服务器实例。我对这个实例有两个问题:

  1. 如何激活这个实例?
  2. 如何在单一模式下运行实例来恢复所有数据库(使用 master)?

sql-server-2008 sql-server linux

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

如何避免在同一个表上进行多个连接(它有 200 列来保存 ID。另一个表有 ID 到值的映射)

我有一个包含以下列的表格清单

ChkId, Q1_ID, Comment1, Checked1, Q2_ID, Comment2, Checked2, ... Q200_ID...

我有一个包含以下列的表格问题

Q_ID,提示

如何用匹配的 Questions.Prompt 替换 Checklist.Q#_ID 而不将它们加入最多 200 次?有没有优雅的解决方案?

database-design sql-server

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

一组 with 后的多个插入查询

我正在尝试以一种可重现的方式用一些测试数据填充数据库。

假设(一个过于简化的示例)三个基表:name、city、job 和两个关系表:name-city 和 name-job。我需要在三个基表中的每一个中创建一个条目,并使用上述条目在两个关系表中创建条目。

我已经拥有了一种使用一系列with查询在 3 个基表中创建条目并将值插入到一个关系表中的方法。

with x as 
(INSERT INTO "public"."name" VALUES(DEFAULT) RETURNING "id"),
y as 
(INSERT INTO "public"."job" VALUES(DEFAULT) RETURNING "id"),
z as 
(INSERT INTO "public"."city" VALUES(DEFAULT) RETURNING "id")

INSERT INTO "public"."name-job"("name", "job")  
select x.id, y.id from x,y;
Run Code Online (Sandbox Code Playgroud)

我真的想添加第二个插入语句

INSERT INTO "public"."name-city"("name", "city")  
select x.id, z.id from x,z;
Run Code Online (Sandbox Code Playgroud)

第一次插入后,但不知道如何。我曾尝试用逗号分隔两个插入语句,并将它们括在括号中,然后用逗号分隔它们,以及其他一些方法,但没有任何效果。

使用带有第二个插入的全新语句并不完全是一种选择,因为我需要使用相同的 x、y、z 值。鉴于我缺乏专业知识/经验,我完全有可能遗漏了一些明显的东西......所以任何关于我如何做到这一点的想法,理想情况下,没有高度复杂的工具,将是最受欢迎的。

FWIW,我正在使用 Postgres (10.x)

postgresql insert subquery postgresql-10

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

从不打 SQL Server 补丁?

我知道Brent 的帖子为什么没有人在这方面修补他们的 SQL Server ..... 和我的一位朋友一起,请假设一个这样的场景,其中近 100 个 SQL Server 从未打过补丁。假设任何用户都没有报告过错误或性能问题。那么,我的朋友是否有一种很酷的方法来识别所有服务器 - 他不知道 - 并且很少有服务器可能已经遇到了一些错误?换句话说,如何在 100 个 SQL Server 中主动发现错误?

一个计划是阅读那些错误的发行说明,其中错误可以使用服务器触发器在发生的基础上(可能是)......在本地表中捕获......在中央位置的SSIS。

但是,这个计划似乎值得吗?

特别关注那些可能会对数据产生影响的错误。(仅供参考,具有纯度的 DBCC CheckDB 运行无错误)。或者一些可能的业务损失。

最后假设,确实在某些 SQL Server 中检测到了一些错误 - 那么,当多年来用户没有报告任何问题时,如何以及为什么将它们视为“威胁”?

sql-server patching

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