SQL Server 2000 中的这个操作数(*= 星号)是啥?
Posted
技术标签:
【中文标题】SQL Server 2000 中的这个操作数(*= 星号)是啥?【英文标题】:What is this operand (*= star-equals) in SQL server 2000?SQL Server 2000 中的这个操作数(*= 星号)是什么? 【发布时间】:2011-09-10 07:43:37 【问题描述】:我有一个从 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。但是,我正在使用包含所有字符而不是整数的 varchars。我是这样写的:
AND a.person_name * a.person_name = b.person_name
瞧!它似乎奏效了。有人可以解释发生了什么吗? *= 运算符是将字符转换为其整数等价物还是?为什么我在网络上的任何地方都找不到这个运算符?
【问题讨论】:
那些是字符串/字符字段吗?想知道将字符串相乘的原因是什么。 是的,它们是 varchar 字段。我也在问自己同样的问题,“你到底为什么要把两个字符串相乘?” 如果您仍在使用 SQl server 2000 数据库,则 =* 或 *= 的所有实例都需要固定为左连接或右连接,因为即使在 SQl server 2000 中隐式连接也被破坏并且可能不会返回正确的结果,因为它有时被解释为交叉连接。在 SQl Server 中,绝不应将隐式连接用于外部连接。 @HLGEM 你能提供这个声明的来源吗?我需要向我的同事证明这一点吗? 引用的其余部分:符合 SQL-92 的外连接在 FROM 子句中指定,不会导致这种歧义。由于 SQL-92 语法更精确,因此此版本不包含有关在 WHERE 子句中使用旧 Transact-SQL 外连接语法的详细信息。 SQL Server 的未来版本可能不支持该语法。任何使用 Transact-SQL 外连接的语句都应更改为使用 SQL-92 语法。 【参考方案1】:在 SQL 2000 中,这被用作 LEFT OUTER JOIN
=* 是一个右外连接
您的查询可能是:
SELECT
*
FROM
tbl1 a LEFT OUTER JOIN tbl2 b ON a.person_name = b.person_name
WHERE
a.id = b.id
如here所述:
使用 非标准产品特定语法 和 WHERE 子句。 *= 运算符 用于指定左外连接 =* 运算符用于指定 右外连接。
【讨论】:
那是他们在学校没有教我的东西。我已经实施了您的建议,并且奏效了。非常感谢! 是的,这是我在更改 SQL 2000 中设计的报表时经常遇到的问题。 这篇文章是很久以前的事了,但我觉得在这里提一下还是不错的。该查询是处理 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【参考方案2】:在 MSSQL 中,WHERE 子句中的 *= 约定表示连接。因此,您真正看到的是 person_name 上 tbl1 和 tbl2 之间的 LEFT OUTER JOIN,其中将返回 tbl1 中的所有值和 tbl2 上的匹配值。
【讨论】:
以上是关于SQL Server 2000 中的这个操作数(*= 星号)是啥?的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER 2000企业管理器,“打开表"可是系统显示:在执行该操作期间出现意外错误!