Сложность области видимости таблицы: объединение подзапроса с предложением where из таблицы вне подзапроса - PullRequest
2 голосов
/ 16 декабря 2011

Я пытаюсь адаптировать хранимую процедуру к представлению, и я столкнулся с проблемой, связанной с областью видимости таблицы в SQL Server 2008 R2.

В sproc был параметр, который указывалCompanyId.Теперь мы хотим получить те же данные, но не ограничивать их определенным идентификатором компании, а сгруппировать по этому идентификатору компании.

Однако моя попытка расширить его не удалась.

Select Distinct [T].[TruckID], [T].[VIN], [T].[Make], [T].[Model], 
    [T].[ModelYear], [T].[RFIDNo], [SQCT].[VendorCode], [SQCT].[UserLabel], 
    [T].[IsActive], [T].[IsFleetTruck], [SQDA].[DriverAssociations], 
    dbo.GetCurrentPlate([T].[TruckID]) [Plate], 
    [TCT].[CompanyId] -- // <- Now we're including it

From [dbo].[Truck] as [T]
    Inner Join [dbo].[TruckerCompanyTruck] as [TCT] 
        On [T].[TruckID] = [TCT].[TruckId]
    Left Outer Join (
        Select [CT].[CompanyTruckId], [CT].[CompanyId], 
            [CT].[TruckId], [CT].[VendorCode], [CT].[UserLabel], 
            [CT].[CreateDate], [CT].[CreateBy], [CT].[UpdateDate], 
            [CT].[UpdateBy], [CT].[Version]
        From [dbo].[CompanyTruck] as [CT]
    ) as [SQCT] 
        On [TCT].[CompanyId] = [SQCT].[CompanyId]
            and [TCT].[TruckId] = [SQCT].[TruckId]
    Left Join (
        Select Distinct [TCTC].[TruckId], Count(*) [DriverAssociations]
        From [TruckerCompanyTruck] [TCTC]
            Inner Join [Trucker] [D]
                On [TCTC].[TruckerId] = [D].[TruckerId]
            Inner Join [TruckerContract] [TC]
                On [TCTC].[TruckerId] = [TC].[TruckerId]
        Where [TCTC].[CompanyId] = [TCT].[CompanyId] -- // Error!
            and [TC].[CompanyId] = [TCT].[CompanyId] -- // Error!
        Group By [TCTC].[TruckId]
    ) as [SQDA]
        On [SQDA].[TruckId] = [T].[TruckId]

The "Ошибка!"Строки throw "Не удалось привязать идентификатор из нескольких частей" TCT.CompanyId ". *

Конечная цель состоит в том, что при выполнении этого запроса будет получено несколько строк для грузовика, который имеет несколько ассоциаций компании, и вернется правильный водительcount.

В конце этот запрос представления ...

Select *
From [FlattenedTruck]
Where [CompanyId] = 28
Order By [VIN]

... должен выдать тот же результат, что и этот.

Exec [GetTrucksForGridWithAssociationCounts] @companyId = 28

Ноотличаются.Sproc возвращает 1 ассоциацию водителей для companyId 28, а представление возвращает 1246 ассоциаций водителей, которые являются всеми ассоциациями для этого грузовика независимо от компании.(Это также отличается, потому что sproc не возвращает companyId, потому что он передается в качестве параметра.)

TruckID -> VIN ->  Make -> Model -> ModelYear -> RFIDNo -> VendorCode -> UserLabel -> IsActive -> IsFleetTruck -> DriverAssociations -> Plate ->        CompanyId
26 ->      NULL -> NULL -> NULL ->  NULL ->      NULL ->   NULL ->       NULL ->      1 ->        0 ->            1246 ->               US-WA-9D68812   28
26 ->      NULL -> NULL -> NULL ->  NULL ->      NULL ->   NULL ->       NULL  ->     1 ->        0 ->            1 ->                  US-WA-9D68812

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Можете ли вы попробовать OUTER APPLY вместо LEFT JOIN к подзапросу SQDA? Вы захотите добавить условие [TCTC]. [TruckId] = [T]. [TruckId] в предложение WHERE в подзапросе, поскольку APPLY не принимает условие ON.

0 голосов
/ 16 декабря 2011

При объединении с подзапросами важно помнить, что объединения внутри подзапроса не осведомлены о таблицах, соединенных вне подзапроса.

Ошибка выдается, потому что вы пытаетесьссылочная таблица TCT внутри скобок подзапроса SQDA, но объединение с псевдонимом TCT находится вне скобок.Вы объединяете ту же таблицу в скобках, что и TCTC, поэтому очень просто изменить любое использование TCT внутри подзапроса на TCTC или переместить его наружу, в зависимости от ситуации.

Таким образом, ваше предложение WHERE станет WHERE [TC]. [CompanyId] = [TCTC]. [CompanyId] внутри подзапроса, и вы бы переместили другое предложение наружу, чтобы присоединиться к подзапросу, поскольку WHERE [TCTC]. [CompanyId] = [TCTC]. [CompanyId] бессмысленно,

Это заставит запрос работать;не зная больше о базовой модели данных, я не могу гарантировать, что она действительно вернет то, что вы намереваетесь вернуть.Но этого должно быть достаточно, чтобы избавиться от ошибки, которую вы сейчас получаете.

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