Это SQL, который вы опубликовали, но немного отформатированный:
SELECT
*
FROM
fit.dbo.CityTemplate ctm
WHERE
NOT EXISTS (
ctm.TemplateCode in (
SELECT
pit.TourCode
FROM
sales97..City cy
Inner join sales97.dbo.Region rg ON rg.Region_Code = cy.Region_Code
Inner join presets.dbo.ProductItinerary pit ON
pit.ProductCode = rg.Region_Code AND
pit.ProductType = 'REGN'
WHERE
isnull(pit.FrzInd,0) = 0 and
isnull(rg.FrzInd,0) = 0 and
isnull(rg.Showonwebind,0) = 1 and
(
cy.Region_Code in (
SELECT
*
FROM
Sales97.dbo.SplitString(@Where, ',')) or
cy.City_code = replace(replace(isnull(@Where,''),',',''),'cy_','')))) OR
(
SELECT
pit.TourCode
FROM
Sales97..Region rg
Inner join presets.dbo.ProductItinerary pit ON
pit.ProductCode = rg.Region_Code AND
pit.ProductType = 'REGN'
WHERE
rg.Region_Code in (SELECT * FROM Sales97.dbo.SplitString(@Where, ',')))
Несколько проблем здесь:
Вы используете NOT EXISTS
, не связывая свою таблицу ctm
с коррелированным запросом (я полагаю, вы хотите, чтобы он был связан). Таким образом, в любом месте внутри подзапроса вы хотите отфильтровать по ctm.TemplateCode
.
SELECT
pit.TourCode
FROM
sales97..City cy
Inner join sales97.dbo.Region rg ON rg.Region_Code = cy.Region_Code
Inner join presets.dbo.ProductItinerary pit ON
pit.ProductCode = rg.Region_Code AND
pit.ProductType = 'REGN'
WHERE
pit.TourCode = ctm.TemplateCode AND -- Here
isnull(pit.FrzInd,0) = 0 and
isnull(rg.FrzInd,0) = 0 and
isnull(rg.Showonwebind,0) = 1 and
(
cy.Region_Code in (
SELECT
*
FROM
Sales97.dbo.SplitString(@Where, ',')) or
cy.City_code = replace(replace(isnull(@Where,''),',',''),'cy_','')))
В начале NOT EXISTS
имеется синтаксическая ошибка. Этому оператору нужен набор результатов (он же SELECT
), вы не можете использовать ctm.TemplateCode IN (...)
. Эта ошибка повторяется и во втором подзапросе. Правильный путь выглядит следующим образом:
SELECT
*
FROM
fit.dbo.CityTemplate ctm
WHERE
NOT EXISTS (
SELECT
...
FROM
SomeTable T
WHERE
T.Field = ctm.Field AND /*Link outmost table with inner tables so it's correlated!*/
...)
Пожалуйста, попробуйте этот фиксированный SQL, хотя я предполагаю, что вам может понадобиться несколько вещей, чтобы проверить, соответствует ли он тому, что вы ищете, с помощью этого запроса:
SELECT
*
FROM
fit.dbo.CityTemplate ctm
WHERE
NOT EXISTS (
SELECT
pit.TourCode
FROM
sales97..City cy
Inner join sales97.dbo.Region rg ON rg.Region_Code = cy.Region_Code
Inner join presets.dbo.ProductItinerary pit ON
pit.ProductCode = rg.Region_Code AND
pit.ProductType = 'REGN'
WHERE
ctm.TemplateCode = pit.TourCode AND -- Link ctm to pit
isnull(pit.FrzInd,0) = 0 and
isnull(rg.FrzInd,0) = 0 and
isnull(rg.Showonwebind,0) = 1 and
(
cy.Region_Code in (
SELECT
*
FROM
Sales97.dbo.SplitString(@Where, ',')) or
cy.City_code = replace(replace(isnull(@Where,''),',',''),'cy_',''))) OR
NOT EXISTS ( -- Repeat the NOT EXISTS operator
SELECT
pit.TourCode
FROM
Sales97..Region rg
Inner join presets.dbo.ProductItinerary pit ON
pit.ProductCode = rg.Region_Code AND
pit.ProductType = 'REGN'
WHERE
ctm.TemplateCode = pit.TourCode AND -- Link ctm to pit
rg.Region_Code in (SELECT * FROM Sales97.dbo.SplitString(@Where, ',')))