2009-06-11 8 views
22

今日、クライアントの運用システム内で、わかりやすい構文を含むSQL Serverクエリが見つかりました。以下の例では、*=オペレータは何をしていますか?私はそれについて何の言及も見つけられなかったon MSDN。クエリが実行され、データが返されます。彼らは、SQL Server 2000を使用していたので、限り誰でも知っているように、これはシステムにされているが、彼らは今、2005年SQL Server * = Operator?

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 

答えて

24

すぐにこのコードを削除し、左の結合で置き換えてください。このコードが正しく解釈されるとは限りません(SQL ServerはSQL Server 2000でもクロス結合と判断することがあります)。また、将来的には廃止予定です。

左のジョインに合わせて、他の暗黙のジョインもすべて削除してください。暗黙的な結合構文はであり、1992年以降はとして廃止されていますが、それでもプロダクションコードには言い訳がありません。暗黙の結合と明示的な結合を混在させると、予期しない結果が生じることがあります

+3

'このコードは常に正しく解釈されるわけではありません(SQL ServerはSQL Server 2000でもクロス結合と判断することがあります)ので、間違った結果が得られます。私はこれがとても古かったことを知っていますが、あなたはこの声明を支持する文書があるかどうか疑問に思っていましたか?ありがとう! – swasheck

+2

* [SQL 2000 BOL:外部ジョインの使用](http://msdn.microsoft.com)から、時々、従来のTransact-SQL外部ジョインに起因するあいまいさの影響を受けないため、SQL-92構文を推奨します。 /en-us/library/aa213228(v=sql.80).aspx)。そのトピックの新しいバージョンでは、 '* ='と '= *'の結合については言及していません。 –

+1

また、(thanks @MikaelEriksson):*この構文を外部結合に使用すると、あいまいな解釈の可能性があるため、非標準的なために使用しないでください。代わりに、FROM句で結合を指定します。* [SQL 2000 BOL:SELECT](http://msdn.microsoft.com/en-us/library/aa259187(v=sql.80).aspx)から。 –

5

を実行していることは、速記の構文に参加。このトピックを扱うこのスレッドを見てください。古いANSI(ANSI-89)の構文は、オペレータが外部結合残って

Transact-SQL shorthand join syntax?

0

。私はそれを使用しないことをお勧めします - ANSI構文はより冗長で、はるかに読みやすいです。

+1

ANSI以外の標準ではないので、ANSIはありません) –

+0

ansi-89ではなくansi-92 –

1

「ANSI以外の外部結合演算子」と思われます。データベースの互換性レベルは80以下でなければなりません。

+1

ansi、ansi-92ではなくansi-89があります。彼らも悪です。 –

10

左外部結合、= *は右外部結合です。

など。以下は等しい。

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

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

実際、それらは常に等しいわけではありません。このような単純なクエリでは、より複雑なクエリでは、データベースが左結合の代わりに十字結合として解釈する良いチャンクがあります。 SQL Server 2000 BOLでもこの問題について話しています。 Explicit構文がサポートされていない初期バージョンを使用している場合を除き、SQLサーバーで暗黙の左結合構文を使用するのが適切な状況はありません。 – HLGEM

6

外部結合の非ANSI構文(*=および=*)は、公式list of deprecated features that will be removed in the next version of SQLにあります。

次のSQL Serverデータベース エンジンの機能は、次のバージョンのSQL Server をサポートされません。 は、新しい 開発作業でこれらの機能を使用せず、 の機能をできるだけ早く使用している のアプリケーションを変更してください。

代替機能はANSI compliant syntax of JOINです。

+0

@ spencer7593あなたは間違っていると思います。 '* ='と '= *'は独自の構文であり、決してANSI/ISO規格ではありませんでした。 –