One of the most common errors that you might face in join statements is this error:
Msg 4104, Level 16, State 1, Line …
The multi-part identifier …… could not be bound.
The main reason for this error is that the source table cannot be found, for example if you have statement such as Table1.OrderDate, and then if you get error above, this means that Table1 cannot be found in the query. Sometimes you can see that source table exists in the query, but T-SQL cannot understand it, especially when you write join statements.
Consider join statement below:
select * from sales.SalesOrderHeader SH
left outer join sales.SalesOrderDetail SD
left outer join Production.Product P
on SD.ProductID=p.ProductID and SH.SalesOrderID=SD.SalesOrderID
With statement above you will get the error :
the reason is that SalesOrderHeader (SH) table is hidden from the third part of the join. and if you want to apply joining condition it will throw the error.
Resolution is:
put join condition of each join statement exactly after it. query below is showing fixed version of that statement:
select * from sales.SalesOrderHeader SH
left outer join sales.SalesOrderDetail SD
on SH.SalesOrderID=SD.SalesOrderID
left outer join Production.Product P
on SD.ProductID=p.ProductID
This statement used SH.SalesOrderID = SD.SalesOrderID right after the first join where the SH table is totally visible.