SQL Server*=操作员?

SQL Server*=操作员?,sql,sql-server,operators,Sql,Sql Server,Operators,今天,在一个客户机的生产系统中,我发现一个SQL Server查询包含一个不熟悉的语法。在下面的示例中,*=操作符做什么?我找不到任何关于它的提及。查询执行并返回数据。据任何人所知,自从他们使用SQLServer2000以来,系统中就已经出现了这种情况,但现在他们正在运行2005 declare @nProduct int declare @iPricingType int declare @nMCC int set @nProduct = 4 set @iPricingType = 2 se

今天,在一个客户机的生产系统中,我发现一个SQL Server查询包含一个不熟悉的语法。在下面的示例中,
*=
操作符做什么?我找不到任何关于它的提及。查询执行并返回数据。据任何人所知,自从他们使用SQLServer2000以来,系统中就已经出现了这种情况,但现在他们正在运行2005

declare @nProduct int
declare @iPricingType int
declare @nMCC int

set @nProduct = 4
set @iPricingType = 2
set @nMCC = 230

--Build SQL for factor matrix

Select distinct
base.uiBase_Price_ID,
base.nNoteRate, 
base.sDeliveryOpt, 
IsNull(base.nPrice,0) as nPrice, 
IsNull(base.nPrice,0) + Isnull(fact.nFactor,0) as nAdjPrice, 
base.iProduct_ID,
fact.iPosition as fiPosition, 
base.iPosition, 
CONVERT(varchar(20), base.dtDate_Updated, 101) + ' ' + CONVERT(varchar(20), base.dtDate_Updated, 108) as 'dtDate_Updated', 
fact.nFactor, 
fact.nTreasFactor, 
product.sProduct_txt ,  
pfi.sPFI_Name,  
mccprod.nServicing_Fee,  
fact.nNoteRate as fNoteRate,  
mcc.nLRA_Charge as nLRA  
From 
tbl_Base_Prices base, tbl_Factors fact, tbl_Product product, tbl_PFI pfi, tbl_MCC mcc, tbl_MCC_Product mccprod 
Where
base.iProduct_ID = @nProduct  
And base.iProduct_ID *= fact.iProduct_ID 
And base.iPosition *= fact.iPosition 
And base.nNoteRate *= fact.nNoteRate 
And base.iPricing_Type = @iPricingType
And fact.iMCC_ID =  @nMCC
And fact.iProduct_ID = @nProduct
And mcc.iMCC_ID =  @nMCC 
And mcc.iPFI_ID = pfi.iPFI_ID 
And mccprod.iMCC_ID =  @nMCC
And mccprod.iProduct_ID =  @nProduct
And base.iProduct_ID = product.iProduct_ID 
and fact.iPricing_Type= @iPricingType
Order By
base.nNoteRate, base.iPosition 

这是一种速记连接语法。看一看这个主题的主题


这是较旧的ANSI(ANSI-89)语法左外联接运算符。我建议不要使用它-ANSI语法更详细,可读性也更高

我相信这些是“非ANSI外部联接运算符”。您的数据库兼容性级别必须为80或更低。

它是左外部联接,=*是右外部联接

例如,以下各项相等:

  SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID

  SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID

立即删除此代码并替换为左联接。即使在SQL Server 2000中,此代码也不总是正确解释(有时SQL Server会确定它是交叉连接),因此可能会给出错误的结果!此外,将来也不推荐使用它(从存档)

我要补充的是,在调整为左连接时,还应该删除所有其他隐式连接。隐式连接语法自1992年以来就已经过时了,没有理由让它仍然存在于生产代码中。混合使用隐式连接和显式连接可能会产生意想不到的结果


外部联接的非ANSI语法(
*=
=*
)在官方网站上

下面是SQL Server数据库 不支持引擎功能 在SQL Server的下一个版本中。做 不要在新版本中使用这些功能 开发工作,并修改 当前使用这些功能的应用程序 尽快推出新功能


替换功能是。

有ansi,只有ansi-89而不是ansi-92。它们也是邪恶的。它是非标准的,没有润滑,所以不是ANSI;)这些是ansi-89,而不是更新的ansi-92
*
从来都不是ansi。实际上,它们并不总是相等的。在这样一个简单的查询中,可能在更复杂的查询中,有一个很好的选择,数据库会将其解释为交叉连接,而不是左连接。甚至SQLServer2000BOL也谈到了这个问题。在SQL server中使用隐式左连接语法是不合适的,除非您使用的是不支持显式语法的早期版本。它是一种交叉连接。逗号
交叉连接
是完全相同的。它只是返回类似于左连接的结果的运算符@DaveBoltman
*=
不表示运算符&当存在
*
时,逗号并不表示交叉连接;整个连接,其中表示不是交叉连接过滤器的内容。@philipxy我站出来更正。你教会了我一些东西-谢谢你<代码>即使在SQL Server 2000中,此代码也不总是正确解释(有时SQL Server会确定它是交叉连接),因此可能会给出错误的结果!此外,它在将来也会被弃用。我知道这很旧,但我想知道您是否有支持此语句的文档?谢谢建议使用SQL-92语法,因为它不会受到传统Transact-SQL外部联接有时产生的歧义的影响。从…起该主题的较新版本甚至没有提到
*=
=*
连接。另外(感谢@MikaelEriksson):不鼓励将此语法用于外部连接,因为它可能会导致解释不明确,而且是非标准的。而是在FROM子句中指定联接。这些参考文献都没有涉及模糊性的确切细节,但事实上,即使是Microsoft也将它们记录为不可靠的,并且能够产生不正确/模糊的结果,这只会加剧您不应该使用它们的情绪。永远,你是阿伦伯特朗。SQL Server BOL也将是我的参考。通过在论坛上回答这样的问题(尽管当时不存在这样的问题),我也知道它们在某些情况下会产生交叉连接,这就是我多年前在BOL中偶然发现引用的原因。@spencer7593我认为你错了<代码>*=和
=*
是专有语法,从未出现在任何ANSI/ISO标准中。