您正在等待哪些SQL改进?

时间:2009-01-23 21:18:10

标签: sql

处理SQL向我们展示了一些限制,让我们有机会想象可能是什么。

您还在等待SQL的哪些改进?你会把哪个放在愿望清单之上?

我认为,如果您在答案中发布您的功能请求缺少的数据库,那就太好了。

46 个答案:

答案 0 :(得分:22)

特定于T-SQL:从存储过程返回的结果集中进行选择的一种不错的方法,该结果集不涉及将其放入临时表或使用某些模糊的函数。

SELECT * FROM EXEC [master].[dbo].[xp_readerrorlog]

答案 1 :(得分:18)

我知道这非常不切实际,但我希望他们能够使INSERT和UPDATE的语法保持一致。谈论无偿的非正交性。

答案 2 :(得分:12)

管理日期(或数字)范围的运营商:

where interval(date0, date1) intersects interval(date3, date4) 

编辑:日期或数字当然是相同的。

编辑2:似乎Oracle有一些事情要做,即未记录的OVERLAPS谓词。更多信息here

答案 3 :(得分:10)

使用分层数据走树的好方法。 Oracle有CONNECT BY但是将对象和自引用连接存储回“父”表的简单而通用的结构很难以自然的方式查询。

答案 4 :(得分:9)

比SQL更多的SQL Server,但更好地与源代码控制集成。最好是SVN而不是VSS。

答案 5 :(得分:7)

隐式连接或应该调用的内容(即绑定到表定义的预定义视图)

  

SELECT CUSTOMERID,SUM(C.ORDERS.LINES.VALUE)FROM   CUSTOMER C

重新设计整个GROUP BY事物,以便SELECT子句中的每个表达式都不必在GROUP BY子句中重复

支持let表达式或其他更合法的地方使用别名,有点与GROUP BY相关,但我发现其他时候我讨厌Oracle强迫我使用外部选择只是为了引用一个大的别名表达。

答案 6 :(得分:6)

我希望能够在字符串处理中使用正则表达式。

答案 7 :(得分:5)

一种动态指定列/表的方法,而不必求助于在另一个上下文中执行的完整动态sql。

答案 8 :(得分:4)

能够无限制地根据其他列定义列(包括消歧)。

这是一个人为的例子而不是现实案例,但我想你会看到我要去的地方:

SELECT LTRIM(t1.a) AS [a.new]
    ,REPLICATE(' ', 20 - LEN([a.new])) + [a.new] AS [a.conformed]
    ,LEN([a.conformed]) as [a.length]
FROM t1
INNER JOIN TABLE t2
    ON [a.new] = t2.a
ORDER BY [a.new]

而不是:

SELECT LTRIM(t1.a) AS [a.new]
    ,REPLICATE(' ', 20 - LEN(LTRIM(t1.a))) + LTRIM(t1.a) AS [a.conformed]
    ,LEN(REPLICATE(' ', 20 - LEN(LTRIM(t1.a))) + LTRIM(t1.a)) as [a.length]
FROM t1
INNER JOIN TABLE t2
    ON LTRIM(t1.a) = t2.a
ORDER BY LTRIM(t1.a)

现在,在SQL Server 2005及更高版本中,我将使用CTE并在连续的层中构建。

答案 9 :(得分:4)

参数化顺序,如:


select * from tableA order by @columName

答案 10 :(得分:4)

我希望供应商实际标准化他们的SQL。他们都犯了罪。来自MySQL和PostGresql的LIMIT/OFFSET子句是一个很好的解决方案,没有其他人可以做。 Oracle有自己的显式JOIN语法,而其他人都使用ANSI-92。 MySQL应该弃用CONCAT()函数并像其他人一样使用||。并且有许多条款和声明超出了标准,可以更广泛地传播。 MySQL的REPLACE就是一个很好的例子。还有更多关于转换和比较类型,列类型,序列等的怪癖等问题。

答案 11 :(得分:3)

支持SQL以指定是否希望优化查询计划以快速返回第一行,或快速返回所有行。

Oracle具有FIRST_ROWS提示的概念,但该语言中的标准方法很有用。

答案 12 :(得分:3)

自动非规范化。

但我可能在做梦。

答案 13 :(得分:2)

使用子查询检查约束,我的意思是:

CHECK ( 1 > (SELECT COUNT(*) FROM TABLE WHERE A = COLUMN))

答案 14 :(得分:2)

在我的愿望清单上是一个支持CHECK约束中的子查询的数据库,而不必依赖materialized view tricks。还有一个支持SQL标准“断言”的数据库,即可能跨越多个表的约束。

其他:与元数据相关的函数,如果可能值的集合较低,则返回给定列的可能值。即,如果列具有到另一列的外键,则它将返回所引用的列中的现有值。如果列具有类似“CHECK foo IN(1,2,3)”的CHECK约束,则返回1,2,3。这将使基于表模式创建GUI元素变得更容易:如果函数返回两个值的列表,程序员可以决定单选按钮小部件是相关的 - 或者如果函数返回 - 例如 - 10个值,应用程序显示下拉窗口小部件。等

答案 15 :(得分:2)

这些都是特定于MS Sql Server / T-SQL的:

  1. “自然”基于现有的外键关系加入。
  2. 轻松使用存储的proc结果作为结果集
  3. 除了
  4. 之外的其他一些循环构造
  5. 跨非NULL值的唯一约束
  6. EXCEPT,IN,所有子句而不是LEFT | RIGHT JOIN WHERE x IS [NOT] NULL
  7. 架构绑定存储过程(轻松#2)
  8. 跨多个数据库的关系,架构绑定视图等

答案 16 :(得分:2)

WITH以外的其他语句的

SELECT子句,适用于UPDATEDELETE

例如:

WITH table as (
  SELECT ...
)
DELETE from table2 where not exists (SELECT ...)

答案 17 :(得分:2)

PostgreSQL中的UPSERT或MERGE。这是一个缺席的一个特征让我难以置信。 Postgres拥有其他一切;为什么他们不能一起行动并实施它,即使是有限的形式?

答案 18 :(得分:2)

我称之为REFERENCE JOIN的东西。它通过隐式使用它们之间的FOREIGN KEY ... REFERENCES约束将两个表连接在一起。

答案 19 :(得分:2)

关系代数DIVIDE运算符。我讨厌总是不得不重新考虑如何在表格B中给出的所有表格中的所有元素。

http://www.tc.umn.edu/~hause011/code/SQLexample.txt

答案 20 :(得分:2)

改进了透视表。我想告诉它根据数据中的键自动创建列。

答案 21 :(得分:1)

更多OOP功能:

  • 存储过程和用户​​功能

    CREATE PROCEDURE tablename.spname(params)AS ...

通过

调用
EXECUTE spname
FROM tablename
WHERE conditions
ORDER BY

隐式地将游标或当前记录传递给SP。 (类似于插入和删除的伪表)

  • 具有继承的表定义

表定义从基表派生,继承公共列等

不过,这不一定是真正的OOP,而只是现有技术的语法糖,但它会大大简化开发。

答案 22 :(得分:1)

抽象表和子类

create abstract table person
  (
  id primary key,
   name varchar(50)
  );

create table concretePerson extends person
  (
  birth date,
  death date
  );

create table fictionalCharacter  extends person
  (
  creator int references concretePerson.id      
  );

答案 23 :(得分:1)

在优化程序生成的计划与测试查询的计划不同的情况下自动执行dba通知。

换句话说,每个查询都可以注册。那时,计划得救了。稍后执行查询时,如果计划发生更改,则dba会收到通知,表示发生了意外情况。

答案 24 :(得分:1)

1)[LEFT |右] SEMI JOIN和[LEFT |右]反加入 这些可以让我写出像

这样的东西
-- return customers who have placed at least one order
SELECT c.*
  FROM Customers c
  LEFT SEMI JOIN o ON o.CustomerId = c.Id

-- return customers who have NOT placed any order
SELECT c.*
  FROM Customers c
  LEFT ANTI JOIN o ON o.CustomerId = c.Id

这与

的结果完全相同
SELECT c.*
  FROM Customers c
 WHERE c.Id IN(SELECT CustomerId FROM Orders)

SELECT c.*
  FROM Customers c
 WHERE c.Id NOT IN(SELECT CustomerId FROM Orders)
分别是

。然而,IN(或几乎相当的EXISTS)语法比我提出的语法要麻烦得多,特别是在更复杂的情况下。

当然,不能引用半/反连接表,因此这将是非法的:

-- Error, can't reference semi joined table.
SELECT c.*, o.OrderNumber
  FROM Customers c
  LEFT SEMI JOIN o ON o.CustomerId = c.Id

2)对

有一个很好的解决方案是很好的
WHERE Column IN('a', 'b', 'c')

当您不知道要搜索的值的数量时出现问题。也许有可能允许

WHERE Column IN(ARRAY @array)

并且调用代码将@array绑定到数组。

编辑:我只想到了一个

3)约束系统的某种可扩展性,允许对表之间的约束进行编码,这些约束在并发环境中完美地工作,并且允许我手动执行任何锁定和验证以确保始终满足约束。触发器目前可以使用,但考虑到并发性,它们很难做到正确。

答案 25 :(得分:1)

增加了Sql Server中的临时数据库支持。间隔,重叠等

增加了Sql Server中的OVER支持,包括LAG,LEAD和TOP。

答案 26 :(得分:1)

检查约束的注释。使用此功能,应用程序(或引发错误时数据库本身)可以查询元数据并检索该注释以将其显示给用户。

答案 27 :(得分:1)

分组依据的字符串聚合(在Oracle中可以使用此trick):

SELECT deptno, string_agg(ename) AS employees
FROM   emp
GROUP BY deptno;

DEPTNO EMPLOYEES
---------- --------------------------------------------------
    10 CLARK,KING,MILLER
    20 SMITH,FORD,ADAMS,SCOTT,JONES
    30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

答案 28 :(得分:1)

<强>阵列

我不确定是什么阻碍了这一点,但缺少阵列导致临时表和相关的混乱。

答案 29 :(得分:1)

某种UPGRADE表允许对表进行更改,就像给定的

CREATE OR UPGRADE TABLE 
( 
  a VARCHAR,
  ---
)

答案 30 :(得分:1)

我的愿望清单(适用于SQLServer)

  1. 能够同时存储/使用存储过程的多个执行计划,并让系统自动了解每次执行时使用的最佳存储计划。
  2. 目前只有一个计划 - 如果它不再是最佳的,那么无论如何都要使用它,或者计算一个全新的计划。

    1. 原生UTF-8存储

    2. 使用多个备用服务器进行数据库镜像,并且能够使用接近“简单”的恢复模式,当然所有服务器都已启动,并且事务在任何地方提交。

    3. 替换功能中的PCRE

    4. 重用大型SQL查询片段,存储匹配条件,选择条件等的一些巧妙方法。与函数类似但实际上更像预处理器宏。

答案 31 :(得分:0)

CreateOrAlter命令。

我厌倦了在“Create Proc”和“Alter Proc”之间来回切换。我不在乎它是创建还是改变,我只是希望最终结果是我放在程序体内的。

答案 32 :(得分:0)

嵌套聚合函数。

PostgreSQL不允许使用SELECT MAX(COUNT(*))......

答案 33 :(得分:0)

MACRO SQL EXPRESSIONS

例如:

SELECT *
  FROM X
 WHERE MACRO_1(A, B, C)

MACRO_1可以是:

A*2/B+C

或类似的东西:

A=2 OR B<C

MACRO_1不是一个函数,它只是一个在最终解析之前被预处理和替换的宏。

它们就像函数一样,但因为被替换,优化器可以利用索引,而不是优化器不知道发生了什么的函数。

答案 34 :(得分:0)

计算列。

无需基于另一个表达式在表上添加列而无需创建视图。

答案 35 :(得分:0)

我很想看到能够在创建索引时放置WHERE子句:

CREATE INDEX BAR ON FOO (FooName, FooId) WHERE FooEnabled = 1;

然后,优化器可以在处理SQL时使用它:

SELECT FooId, FooName
FROM Foo
WHERE FooEnabled = 1
ORDER BY FooName;

这似乎是索引创建和优化器两个方面的可解决问题。实际上,您可以使用基于函数的索引和/或物化视图来模拟相同的事物。这很麻烦,可能涉及更改应用程序发出的SQL。

上面有一个语法糖会很好。

答案 36 :(得分:0)

特定于SQL Server:

一些体面的日期功能,如TRUNC。 改进全文搜索(更好地控制匹配逻辑)

如果SQL服务器可以在同一个数据库和日志文件(共享FILEGROUPS)中存储不同的数据库,我会很喜欢它,所以我可以一次备份整个服务器。

编译时存储过程的完整语法和错误检查(不仅仅是在我运行它时)

是的,这听起来像是“我想要SQL Server中的所有Oracle功能而没有所有的复杂性(和成本!)”

答案 37 :(得分:0)

凯文在几秒钟内打败了我......但更一般地说,

select @columnName from @tableName
order by @otherColumnName

它将呈现大量令人讨厌的字符串连接,然后是

exec (@sql) 

立刻就没必要了。

答案 38 :(得分:0)

不再有记录大小/命令长度限制。

答案 39 :(得分:0)

选择递归表:

   select * from rdfClass where rdfClass.uri is instance of "foaf:Person";

答案 40 :(得分:0)

类似LINQ的功能集成到SQL: - )

答案 41 :(得分:0)

部分外键约束。

如果有这些表:

create table prova_a (a number, b number);
alter table prova_a add primary key (a,b);
create table prova_b (a number, b number);
alter table prova_b add foreign key (a,b) references prova_a(a,b) ;
insert into prova_a  values (1,2);

您可以插入此内容而不会出现错误:

insert into prova_b  values (123,null);
insert into prova_b  values (null,null);
insert into prova_b  values (null,123);

我希望在不使用检查约束的情况下避免这种情况。

答案 42 :(得分:0)

为那些不支持它们的平台高效实施DOM标准,如DOMAIN。

答案 43 :(得分:0)

管理其他表上的间隔日期的外键

例如,对于表格:

TABLE_A(begin DATE, end DATE)
TABLE_B(day DATE)

定义On TABLE_B的某种方式:

FOREIGN KEY (day)
  REFERENCES INTERVAL ON TABLE_A (begin, endd)

答案 44 :(得分:0)

优化QBE(按示例查询)。最后,为我们提供了一种方法,可以将所有那些想要在任意列子列上匹配的查询的责任传递给数据库。


编辑:QBE是一种用于查询关系数据的非SQL方法。将它添加到SQL可能看起来像

SELECT列
从表
示例(名字,姓氏,生日)=('Fred%','Jones','20090209')

在功能上支持Access对图形querydef设计器的功能。您给它一个字段列表,并收集一组匹配的用户输入,优化器将抛出未指定的列并优化其余列。

答案 45 :(得分:0)

清洁执行最佳执行计划的方法。

MSSQL和Oracle中有一些提示,但您需要说服 DBMS使用它们,它们可以被忽略,这被引用为一个功能,而不是文档中的错误。< / p>