SQL Server 2000中的这个操作数(*=星号等于)是什么?

23

我有一个查询语句,从 MS SQL 2000 中提取并插入到了一个 MySQL 查询中。但是,MySQL 却无法识别 *= 操作符。在这个例子中,我有两个称为 person_name 的 varchar 列。

SELECT * FROM tbl1 a, tbl2 b 
WHERE a.id = b.id
AND a.person_name *= b.person_name

我知道在其他语言中,myInt *= myTotal 也可以读作 myInt * myInt = myTotal。然而,我正在处理包含所有字符但没有整数的varchar。我写成了:

AND a.person_name * a.person_name = b.person_name

哇!看起来它已经有效了。有人能解释一下发生了什么吗?*= 运算符是把字符转换为它们的整数等价物还是其他的操作呢?为什么我在网上找不到这个运算符呢?


那些是字符串/字符字段吗?不知道将字符串相乘的原因是什么。 - Marc B
1
是的,它们是varchar字段。我也在问自己同样的问题,“为什么要将两个字符串相乘?” - Blaise Swanwick
1
如果你仍在使用SQL Server 2000数据库,则需要将所有的==实例修复为左连接或右连接,因为即使在SQL Server 2000中,隐式连接也存在问题,可能不能返回正确的结果,有时会被解释为交叉连接。在SQL Server中,不应该使用隐式连接进行外连接。 - HLGEM
@HLGEM,您能提供此声明的来源吗?我需要向我的同事证明这一点。 - Hurda
直接引用BOL:在早期版本的Microsoft® SQL Server™ 2000中,左外连接和右外连接条件是使用*=和=*运算符在WHERE子句中指定的。在某些情况下,这种语法会导致一个模棱两可的查询,可以被解释为多种方式。 - HLGEM
1
符合SQL-92标准的外连接在FROM子句中指定,不会导致这种歧义。由于SQL-92语法更加精确,因此关于在WHERE子句中使用旧的Transact-SQL外连接语法的详细信息未包含在本版本中。该语法可能在将来的SQL Server版本中不被支持。任何使用Transact-SQL外连接的语句都应更改为使用SQL-92语法。 - HLGEM
2个回答

23

在SQL 2000中,这被用作左外连接

=*是右外连接

您的查询可能是:

SELECT 
  * 
FROM 
  tbl1 a LEFT OUTER JOIN tbl2 b ON a.person_name = b.person_name
WHERE 
  a.id = b.id

此处所述:

使用非标准的产品特定语法和WHERE子句指定外连接。*=运算符用于指定左外连接,=*运算符用于指定右外连接。


这是学校没有教我的东西。我已经实现了你的建议,而且它起作用了。非常感谢! - Blaise Swanwick
是的,这是我在修改用SQL 2000设计的报表时经常遇到的问题。 - CristiC
1
这篇文章发布已经有一段时间了,但我认为在这里提及它是很好的。这个查询是处理LEFT OUTER JOIN时经典错误的一个例子。由于WHERE子句中的a.id = b.id,实际上就变成了INNER JOIN。要进行真正的LEFT OUTER JOIN,WHERE子句应该移至LEFT OUTER JOIN中,如:LEFT OUTER JOIN ... a.person_name = b.person_name AND a.id = b.id。 - umphy

4
在 MSSQL 中,WHERE 子句中的 *= 惯例表示连接。因此您实际上看到的是 tbl1 和 tbl2 之间在 person_name 上的左外连接,其中将返回 tbl1 的所有值和与 tbl2 匹配的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接