SQL Server * = Оператор?
Сегодня, находясь внутри клиентской системы производства, я нашел запрос 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
Ответы
Ответ 1
Немедленно удалите этот код и замените его левым соединением. Этот код не всегда правильно интерпретируется (иногда SQL Server решает, что это перекрестное соединение) даже в SQL Server 2000 и, следовательно, может дать неверные результаты! Также он устарел для будущего.
Я собираюсь добавить, что при настройке на левые соединения вы также должны удалить все другие неявные соединения. Синтаксис неявного соединения был устаревшим с 1992 года, нет оправдания тому, что он все еще находится в производственном коде. И смешивание неявных и явных объединений может дать неожиданные результаты.
Ответ 2
Это левое внешнее соединение, = * - правое внешнее объединение.
например. следующие равны:
SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID
SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID
Ответ 3
Синтаксис не ANSI для внешних соединений (*=
и =*
) находится в официальном списке устаревших функций, которые будут удалены в следующем версии SQL.
Следующая база данных SQL Server Функции двигателя не поддерживаются в следующей версии SQL Server. Делать не использовать эти функции в новых разработки и изменения приложения, которые в настоящее время используют эти как можно скорее.
Функция замены - ANSI-совместимый синтаксис JOIN.
Ответ 4
Это сокращенный синтаксис соединения. Взгляните на эту тему, которая охватывает эту тему.
Синтаксис коротких ссылок Transact-SQL?
Ответ 5
Я считаю, что это "внешние ANSI-соединения без ANSI". Уровень совместимости вашей базы данных должен быть 80 или ниже.
Ответ 6
Чтобы старый синтаксис ANSI (ANSI-89) оставил внешний оператор объединения. Я бы рекомендовал не использовать его - синтаксис ANSI является более подробным и более читаемым.