在我的代码中,我使用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) 我有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) 我有两点,我必须计算它们之间的差异。
我在 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)
谁能告诉我为什么计算两点之间的距离时结果存在差异?
我已经读到 Microsoft SQL Server 已弃用text数据类型而支持varchar(max).
PostGreSQL 已经允许varchar(没有长度)作为text.
问题是,ANSI SQL 标准对弃用text和最佳替代方案有何看法?另外,MySQL/MariaDB 是否也遵循这一点?
谢谢
我有一个包含三个整数列的表:
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 解决。
目前我有下表:
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) 我计划将 SQL Server 2008 标准版迁移到 Linux 服务器实例。我对这个实例有两个问题:
我有一个包含以下列的表格清单
ChkId, Q1_ID, Comment1, Checked1, Q2_ID, Comment2, Checked2, ... Q200_ID...
我有一个包含以下列的表格问题
Q_ID,提示
如何用匹配的 Questions.Prompt 替换 Checklist.Q#_ID 而不将它们加入最多 200 次?有没有优雅的解决方案?
我正在尝试以一种可重现的方式用一些测试数据填充数据库。
假设(一个过于简化的示例)三个基表: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)
我知道Brent 的帖子为什么没有人在这方面修补他们的 SQL Server ..... 和我的一位朋友一起,请假设一个这样的场景,其中近 100 个 SQL Server 从未打过补丁。假设任何用户都没有报告过错误或性能问题。那么,我的朋友是否有一种很酷的方法来识别所有服务器 - 他不知道 - 并且很少有服务器可能已经遇到了一些错误?换句话说,如何在 100 个 SQL Server 中主动发现错误?
一个计划是阅读那些错误的发行说明,其中错误可以使用服务器触发器在发生的基础上(可能是)......在本地表中捕获......在中央位置的SSIS。
但是,这个计划似乎值得吗?
特别关注那些可能会对数据产生影响的错误。(仅供参考,具有纯度的 DBCC CheckDB 运行无错误)。或者一些可能的业务损失。
最后假设,确实在某些 SQL Server 中检测到了一些错误 - 那么,当多年来用户没有报告任何问题时,如何以及为什么将它们视为“威胁”?
sql-server ×6
postgresql ×5
mysql ×2
insert ×1
linux ×1
max ×1
patching ×1
postgis ×1
spatial ×1
sql-standard ×1
subquery ×1