Tsql “多部分标识符”;t、 零件号“;无法与联盟绑定

Tsql “多部分标识符”;t、 零件号“;无法与联盟绑定,tsql,Tsql,我需要TableMain中的记录,它在ActivePNs中有一个记录匹配,在[Parts]中也有一个匹配。似乎一个连接应该可以做到这一点,但我一直遇到“无法绑定”或“无效列名”错误 我确信我可以通过创建一个临时表来完成我所需要的,但我尽量保持它的简单 Select * from TableMain t INNER JOIN (select [PartNumber] From ActivePNs ap Where ap.PartNumber = t.PartNumber

我需要TableMain中的记录,它在ActivePNs中有一个记录匹配,在[Parts]中也有一个匹配。似乎一个连接应该可以做到这一点,但我一直遇到“无法绑定”或“无效列名”错误

我确信我可以通过创建一个临时表来完成我所需要的,但我尽量保持它的简单

Select * from TableMain t
INNER JOIN  (select [PartNumber] 
    From ActivePNs ap
    Where ap.PartNumber = t.PartNumber
    Union
    select [Number] PartNumber 
    From [Parts] p
    Where p.Number = t.PartNumber) c 
On t.PartNumber = c.PartNumber 

假设ActivePNs中没有多行或给定零件号的零件,那么据我所知,这应该可以做到——只在TableMain中查找ActivePNs和零件中有零件号的行:


您的问题在于
联合后的
选择

select [Number] PartNumber   -- You rename Number to PartNumber
  From [Parts] p
  Where p.Number = t.PartNumber  -- but still reference Number here

SELECT
中的
Number
的别名表示在查询的
WHERE
部分中没有列
p.Number

派生表不能与其所联接的表相关联。您尝试执行的操作可以如下所示:

SELECT
  t.*,
  COALESCE(ap.PartNumber, p.Number) AS PartNumber
FROM TableMain t
  LEFT JOIN ActivePN ap ON ap.PartNumber = t.PartNumber
  LEFT JOIN Parts p ON p.Number = t.PartNumber
WHERE NOT (ap.PartNumber IS NULL AND p.Number IS NULL)

你的意思是:哪里不是(ap.零件号为空,p.编号为空)@JonV:基本上是的。我通常在这种情况下测试PKs,但我应该马上澄清这一点,或者使用您的版本。更新了我的答案。抱歉-我正在TableMain中查找在ActivePNs或Parts中具有PartNumber的行。叹气-我也想到ActivePN和Part有一些相同的记录。所以我也需要做一个小组,看起来。。。
SELECT
  t.*,
  COALESCE(ap.PartNumber, p.Number) AS PartNumber
FROM TableMain t
  LEFT JOIN ActivePN ap ON ap.PartNumber = t.PartNumber
  LEFT JOIN Parts p ON p.Number = t.PartNumber
WHERE NOT (ap.PartNumber IS NULL AND p.Number IS NULL)