Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t SQL ANSI-92标准优于ANSI-89?_Sql_Join_Ansi Sql_Ansi 92 - Fatal编程技术网

为什么不是';t SQL ANSI-92标准优于ANSI-89?

为什么不是';t SQL ANSI-92标准优于ANSI-89?,sql,join,ansi-sql,ansi-92,Sql,Join,Ansi Sql,Ansi 92,在我工作过的每一家公司,我都发现人们仍然在用ANSI-89标准编写SQL查询: select a.id, b.id, b.address_1 from person a, address b where a.id = b.id select a.id, b.id, b.address_1 from person a inner join address b on a.id = b.id 与ANSI-92标准不同: select a.id, b.id, b.address_1 from per

在我工作过的每一家公司,我都发现人们仍然在用ANSI-89标准编写SQL查询:

select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id
select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id
与ANSI-92标准不同:

select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id
select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id
对于这样一个非常简单的查询,可读性没有太大区别,但对于大型查询,我发现将连接条件分组并列出表,可以更容易地看到连接中可能存在的问题,让我将所有筛选保留在where子句中。更不用说,我觉得外部联接比Oracle中的(+)语法直观得多

当我试图向人们宣传ANSI-92时,使用ANSI-92比使用ANSI-89有什么具体的性能优势吗?我会自己尝试,但是我们这里的Oracle设置不允许我们使用EXPLAIN PLAN-不希望人们尝试优化他们的代码,是吗?

根据Peter Gulutzan和Trudy Pelzer的“SQL性能调优”,他们测试了六到八个RDBMS品牌,SQL-89与SQL-92样式的联接在优化或性能方面没有差异。可以假设大多数RDBMS引擎在优化或执行查询之前将语法转换为内部表示,因此人类可读的语法没有任何区别

我还尝试宣传SQL-92语法。在它被批准16年后,人们应该开始使用它了!所有品牌的SQL数据库现在都支持它,因此没有理由继续使用非标准的
(+)
Oracle语法或
*=
Microsoft/Sybase语法

至于为什么很难打破开发人员社区的SQL-89习惯,我只能假设有一个很大的“金字塔底部”的程序员,他们使用书籍、杂志文章或其他代码库中的古老示例,通过复制和粘贴进行编码,而这些人并不是抽象地学习新语法。有些人模式匹配,有些人死记硬背


不过,我逐渐看到人们比以前更频繁地使用SQL-92语法。我从1994年开始在线回答SQL问题。

我想到了几个原因:

  • 人们这样做是出于习惯
  • 人们很懒,喜欢“旧式”连接,因为它们涉及的打字更少
  • 初学者通常很难理解SQL-92连接语法
  • 人们不会仅仅因为新语法存在就切换到新语法
  • 人们不知道新语法(如果你想这样称呼它)的好处,主要是它允许你在进行外部连接之前过滤一个表,而不是在进行外部连接之后过滤一个表,因为你只有WHERE子句

就我而言,我用SQL-92语法进行所有连接,并在可能的地方转换代码。这是一种更干净、可读性更强、功能更强大的方法。但是很难说服人们使用这种新样式,因为他们认为在不改变查询结果的情况下,这种样式会对他们造成更多的打字工作的伤害。

我不确定答案。。这是一场宗教战争(比Mac Pc或其他电脑的程度低)

有人猜测,直到最近,Oracle(可能还有其他供应商)还没有采用ANSI-92标准(我认为是在Oracle v9或其他版本中),因此,对于仍在使用这些版本的公司工作的DBA/Db开发人员,(或者希望代码能够跨可能使用这些版本的服务器进行移植,他们必须坚持旧标准

真的很遗憾,因为新的连接语法更具可读性,而旧的语法会生成错误(不正确)的结果,从而导致一些有详细文档记录的场景

  • 具体地说,当存在外部连接时 是条件筛选谓词 从 表位于设备的“外侧” 加入

我可以从一个普通开发人员的角度来回答这个问题,我只知道足够的SQL来理解这两种语法,但每次我需要它的时候仍然用谷歌搜索insert的确切语法…:-p(我不是整天都用SQL,只是不时地解决一些问题。)

事实上,我发现第一种形式更直观,在两个表之间没有明显的层次结构。事实上,我在可能的旧书中学习SQL,显示第一种形式,可能没有帮助…;-)
我在谷歌的sql select搜索中找到的第一个引用(它为我返回了大部分法语答案…)首先显示了旧的形式(然后解释第二个)


就“为什么”这个问题给出一些提示…^^我应该读一本好的现代书(DB不可知论)关于这个主题。如果有人提出建议…

Oracle根本没有很好地实现ANSI-92。我遇到了几个问题,这不仅仅是因为Oracle应用程序中的数据表具有非常好的列。如果联接中的列数超过约1050列(这在应用程序中很容易做到),那么您将得到这个完全没有逻辑意义的伪错误:

ORA-01445: cannot select ROWID from a join view without a key-preserved table.
使用旧式连接语法重新编写查询会使问题消失,这似乎将矛头直指ANSI-92连接的实现

在遇到这个问题之前,我一直是ASNI-92的坚定推动者,因为它有助于减少意外交叉连接的机会,而使用旧式语法很容易做到这一点


然而,现在我发现坚持下去要困难得多。他们指出Oracle的糟糕实现,并说“我们会按自己的方式来做,谢谢。”

我不能代表所有的学校说话,但在我的大学里,当我们在做我们课程的SQL模块时,他们没有教ANSI-92,他们教ANSI-89-在一个旧的VAX系统上!我没有接触到ANSI-92,直到我开始在Access中挖掘,使用查询设计器构建了一些查询,然后挖掘SQL代码。真的吗sing我不知道它是如何完成连接的,也不知道我开始挖掘的语法的含义
select foo.baz
from foo, bar
where foo.a *= bar.a
(1)select * from TABLE_OFFICES to,BIG_TABLE_USERS btu
where to.iduser=tbu.iduser and to.idoffice=1
(2)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser
where to.idoffice=1
(3)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser and to.idoffice=1