2013-06-01 22 views
4

我編寫此代碼多部分標識符不能在左外的束縛聯接函數

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn LEFT OUTER JOIN 
      (
       SELECT tblrtm.rtmid 
       FROM dbo.getrtmn(tblprsn.prsnid) as getrtmn_1 
      ) AS tblgetrtmn 
      ON tblprsn.prsnid = tblgetrtmn.rtmid 

的dbo.getrtmn是表值函數,並且具有唯一標識符字段命名rtmid。 prsnid是唯一標識符

當我運行該SQL查詢的原因錯誤:

The multi-part identifier " tblprsn.prsnid" could not be bound.

回答

4

這是您的查詢:

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn LEFT OUTER JOIN 
    (SELECT tblrtm.rtmid 
     FROM dbo.getrtmn(tblprsn.prsnid) as getrtmn_1 
    ) AS tblgetrtmn 
    ON tblprsn.prsnid = tblgetrtmn.rtmid 

你引用的第一個表中的子查詢。這是不允許的。首先,我不認爲子查詢是必要的。您只能從第一張表中選擇並執行left outer join以保留所有記錄。子查詢的唯一影響是將行相乘。因此,當你寫它,這個查詢應該做的是幾乎同樣的事情(除了重複):

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn; 

你可以做你想做的原始查詢什麼,不過,使用apply而不是join

SELECT tblprsn.prsnid, tblprsn.name 
FROM tblprsn cross apply 
    dbo.getrtmn(tblprsn.prsnid) tblgetrtmn 
where tblprsn.prsnid = tblgetrtmn.rtmid 
+0

@AlexanderFedorenko 。 。 。應該沒有圍繞函數調用的子查詢。 –

+0

用OUTER APPLY +子查詢和CROSS APPLY + WHERE子句查詢的不同語義http://sqlfiddle.com/#!3/2f718/5 –

+0

@AlexanderFedorenko。 。 。我意識到這一點。原始查詢可能不是OP需要處理的真正查詢。如果是這樣,從表中選擇的簡化版本可能會起作用。你的SQLFiddle在顯示差異方面做得很好(這與外連接和內連接之間的差異相同)。 –

1

而不是LEFT OUTER JOIN使用OUTER APPLY和相關的子查詢。外apply子句返回左邊表中的所有行是否返回任何表中的行-valued功能或沒有,因此類似於LEFT OUTER JOIN

SELECT t.prsnid, t.name, getrtmn_1.* 
FROM tblprsn t OUTER APPLY (
          SELECT rtmid 
          FROM dbo.getrtmn(t.prsnid) AS tblgetrtmn 
          WHERE t.prsnid = tblgetrtmn.rtmid 
          ) as getrtmn_1 

演示上SQLFiddle

相關問題