SQL Server * = оператор? - PullRequest
       10

SQL Server * = оператор?

24 голосов
/ 12 июня 2009

Сегодня, находясь внутри производственной системы клиента, я обнаружил запрос SQL Server, который содержал незнакомый синтаксис. В приведенном ниже примере, что делает оператор *=? Я не смог найти упоминаний об этом на MSDN . Запрос выполняет и возвращает данные. Насколько известно, это было в системе с тех пор, как они использовали SQL Server 2000, но теперь они работают под управлением 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 

Ответы [ 6 ]

26 голосов
/ 12 июня 2009

Немедленно удалите этот код и замените его на левое соединение. Этот код не всегда интерпретируется правильно (иногда SQL Server решает, что это перекрестное соединение) даже в SQL Server 2000 и, следовательно, может давать неверные результаты! Также не рекомендуется на будущее.

Я собираюсь добавить, что при настройке левых объединений вы должны также удалить все эти неявные объединения. С неявного синтаксиса соединения с 1992 года устарел , нет оправдания тому, что он все еще находится в рабочем коде А смешивание неявных и явных объединений может дать неожиданные результаты.

10 голосов
/ 12 июня 2009

Это левое внешнее соединение, = * - правое внешнее соединение.

например. следующие равны;

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

  SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID
6 голосов
/ 12 июня 2009

Синтаксис не ANSI для внешних объединений (*= и =*) включен в официальный список устаревших функций, которые будут удалены в следующей версии SQL .

Следующая база данных SQL Server Функции движка не поддерживаются в следующей версии SQL Server. Делать не использовать эти функции в новом разработка и модификация приложения, которые в настоящее время используют эти функции как можно скорее.

Функцией замены является ANSI-совместимый синтаксис JOIN .

5 голосов
/ 12 июня 2009

Это сокращенный синтаксис соединения. Взгляните на эту ветку, которая охватывает эту тему.

Синтаксис стенографического соединения Transact-SQL?

1 голос
/ 12 июня 2009

Я полагаю, что это "не-ANSI операторы внешнего соединения". Уровень совместимости вашей базы данных должен быть 80 или ниже.

0 голосов
/ 12 июня 2009

Это более старый синтаксис ANSI (ANSI-89) для оператора левого внешнего соединения. Я бы порекомендовал не использовать его - синтаксис ANSI более многословен и намного удобочитаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...