表范围难度:使用子查询外部的表中的where子句连接子查询

时间:2011-12-15 21:30:15

标签: tsql sql-server-2008-r2

我正在尝试将存储过程调整到视图中,并且我遇到了SQL Server 2008 R2中似乎是表格范围问题的问题。

在sproc中,有一个参数指定了companyId。现在我们要检索相同的数据,但不要将其限制为特定的companyId,而是将其限制为该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]

“错误!”行抛出“多部分标识符”TCT.CompanyId“无法绑定。”

最终目标是运行此查询将为具有多个公司关联并返回正确驱动程序计数的卡车生成多行。

最后,查看视图...

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

...应该产生与此相同的输出。

Exec [GetTrucksForGridWithAssociationCounts] @companyId = 28

但不同。 sproc返回companyId 28的1个驱动程序关联,视图返回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 个答案:

答案 0 :(得分:1)

你可以尝试OUTER APPLY而不是LEFT JOIN到SQDA子查询吗?您需要将[TCTC]。[TruckId] = [T]。[TruckId]的条件添加到子查询中的WHERE子句中,因为APPLY不会处于ON状态。

答案 1 :(得分:0)

在加入子查询时,请务必记住子查询中的连接知道在子查询外部加入的表。

抛出错误是因为您试图在SQDA子查询的括号内引用表TCT,但是对于TCT的别名连接是在括号之外。您正在加入TCTC括号内的同一个表,因此将子查询中的TCT的任何使用更改为TCTC,或者将其移到外部是一个简单的问题。

所以你的WHERE子句将成为子查询中的WHERE [TC]。[CompanyId] = [TCTC]。[CompanyId],并且你会将其他子句移到外面以加入子查询,因为WHERE [TCTC]。[CompanyId ] = [TCTC]。[CompanyId]毫无意义,

这将使查询起作用;在不了解底层数据模型的情况下,我无法保证它实际上会返回您想要返回的内容。但这足以让你超越你目前所犯的错误。