Используйте, если не существует в предложении, где - PullRequest
0 голосов
/ 11 января 2019

Я получаю Incorrect syntax near 'ctm' Следующий запрос ...

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, 
',')))

Если Query 1, т.е. 'sales97..City не возвращает ни одной строки, тогда мне нужно выполнить Query2, т.е. Sales97..Region.

1 Ответ

0 голосов
/ 11 января 2019

Это 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, ',')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...