Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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
Sql =*是什么意思?_Sql_Sql Server_Database_Tsql - Fatal编程技术网

Sql =*是什么意思?

Sql =*是什么意思?,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我正在尝试跟踪Microsoft Server中的一些SQL。我遇到一个使用我不熟悉的约定的联接。“=*”是什么意思 这是表示联接的旧式语法我认为这是表示表1到表2的外部联接条件的旧式语法 旧式: SELECT * FROM table1, table2 WHERE table1.yr =* table2.yr -1 新样式(SQL92): A???外部联接是使用WHERE子句中的符号=*代替=指定的。这是ANSI SQL92中不推荐使用的旧联接样式。新语法使用内部联接和外部联接,它们基于表达

我正在尝试跟踪Microsoft Server中的一些SQL。我遇到一个使用我不熟悉的约定的联接。“
=*
”是什么意思


这是表示联接的旧式语法

我认为这是表示表1到表2的外部联接条件的旧式语法

旧式:

SELECT * FROM table1, table2
WHERE table1.yr =* table2.yr -1
新样式(SQL92):


A???外部联接是使用WHERE子句中的符号=*代替=指定的。

这是ANSI SQL92中不推荐使用的旧联接样式。新语法使用内部联接和外部联接,它们基于表达式而不是等式联接表

from table1 left outer join table2 on table1.yr = table2.yr - 1 从…起 表1表1上的左外连接表2.yr=表2.yr-1 这:

…是旧的TSQL(SQL Server 2005之前)外部联接语法,不是ANSI联接


参考:

这是ANSI SQL 1989右外部联接的语法,其中*=将是左外部联接


您还应该注意,在SQL 2008中不推荐将连接语法放在WHERE子句中 这意味着代码需要立即更换!此样式连接应该是正确的连接。不幸的是,它有时会被解释为交叉联接,因此使用此联接的结果可能不正确。此外,此语法已弃用,无法在下一版本的SQl server中使用

这里有很多愚蠢的答案。您没有给出FROM子句,因此无法判断您的*=表示左外连接还是右外连接

WHERE table1.yr =* table2.yr -1
当然,是外部联接的旧语法。但是任何声称知道它是左外连接还是右外连接的人都是错的。这取决于表1和表2在FROM子句中的命名顺序,但没有给出

SELECT *
FROM table1, table2
WHERE table1.yr =* table2.yr -1
意思与此相同:

  SELECT *
  FROM
    table2
    LEFT OUTER JOIN
    table1
    ON table1.yr = (table2.yr - 1)
,并且不符合ANSI标准

像这样:

  WHERE table1.yr (+)= table2.yr
简单明了。 这是一个SQL-92外部联接运算符()

不要使用它,它非常古老,但它类似于左连接和右连接。 它所做的只是告诉连接的哪一侧是“父”侧,因此将首先考虑该侧的行



如果您尝试在SQL 2005上运行此命令,它将抛出一个错误,说明您需要在兼容模式下运行此命令。

停止对我进行向下投票,右侧的星号表示此端可以包含null。它是左外连接。无法回答“is*=左外连接或右外连接”的问题,因为您可以从a.c*=B.c上的a,B*=a.c上的a,B*=a.c同一运算符(*=)写入,但一个是左外连接,一个是右外连接。然而,我认为你错了,*位于外表列的一侧,而不是内表列的一侧。这个论点的寓意是,这是可怕的语法。我最喜欢HLGEM的答案。我可以从实际尝试中告诉你*=是左连接(boy很难写出语法,不寒而栗)。谢谢你的好话,史蒂夫。好吧,我放弃。没有什么能打败实际的尝试。@HLGEM:你说“*=是左连接。那么你是说这些都是左连接吗?(1)从A.k*=B.k的连接B中选择*;(2)从B.k*=A.k的连接B中选择*;(3)从A.k*=B.k的连接B中选择*;(2)选择*FROM B JOIN A ON B.k*=A.k;?我不这么认为。你是说,如果去掉*并在JOIN之前添加LEFT OUTER(因为*=意味着LEFT JOIN),这将更新他们的新语法?@victor hugo我在这方面还是个新手,请友善。老实说,我先画了这一行,只是想帮你。有趣的是,我意外发现,这些不需要思考的人比那些更难回答的问题得到了更多的重复。顺便说一句,你为什么在这方面取笑我,而不是后来的回答考虑拥有更高的代表性/更久的会员资格?@mjv:我想维托其实是在取笑我。@mjv:我认为获得无脑者的代表性更容易,因为对更多人来说,这比深奥的东西更清楚。观众越多,获得更多选票的机会就越大。@rexem/victor。宾果,我现在明白了。我没有看到rexem关于缺乏具体性的第一句评论。。。哈哈,有趣的是我们是如何被卷入这场有趣的竞赛的;-)它的意思是:用新的sql语法重写我!如果你已经足够大,记住了语法…他会给你一个吻。不。这个*表示哪个表被保留了,所以在这个例子中表2被保留了。是的,表2被保留了。我没有说其他。但是你仍然不能告诉我这是否是LEFT连接或右连接,可以吗?在旧语法中,通常使用连接条件来确定哪个表被认为是左的,哪个是右的。FROM子句中的顺序是不相关的。如果您实际尝试,您会发现FROM顺序是不相关的,并且=是左连接,=是右连接。@Turismo和HLGEM:在FROM子句中,与旧式的*=和=*运算符的作用无关。这里没有参数。但我的观点是:你说“…”是什么意思。。。是左连接" ? 考虑这些查询:从A.K= B.K上的左外部连接B选择A.I,B.J;从a.k=b.k上的右侧外部连接b中选择a.i、b.j;从b.k=a.k的左侧外部连接b中选择a.i、b.j;从b.k=a.k的右侧外部连接b中选择a.i、b.j;哪些是左连接?哪一个可以用=*?请不要告诉我包含关键字RIGHT的查询是“left join”。对于否决该查询的人,我这样说是因为当前代码在任何标准下都是不正确的,因为即使早在SQL Server 2000上,也无法保证正确的结果。它甚至指出,该代码在SQLServer2000联机丛书中的结果不一致。离开它,代码库将是危险的和不专业的。实际上Oracle语法是相反的。(+)位于内部(或可选)工作台的侧面,但星形位于外部工作台的侧面。所以table1.yr=*table2.yr应该是table1.yr(+)=table2.yr实际上你的例子是不正确的。如果你真的想使用左外连接,它会是b
SELECT *
FROM table1, table2
WHERE table1.yr =* table2.yr -1
  SELECT *
  FROM
    table2
    LEFT OUTER JOIN
    table1
    ON table1.yr = (table2.yr - 1)
  WHERE table1.yr (+)= table2.yr