守候你守候我
2019-08-02 14:35:24
無法綁定多部分標識符我在SO上看到過類似的錯誤,但我找不到解決問題的方法。我有一個SQL查詢,如:SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcdFROM phuongxa a ,
quanhuyen b LEFT OUTER JOIN ( SELECT maxa ,
COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND
'Sep 5 2011'
GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxaWHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;當我執(zhí)行此查詢時,錯誤結果為: 無法綁定多部分標識符“a.maxa”。為什么? P / s:如果我將查詢分成2個單獨的查詢,它運行正常。SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyenFROM phuongxa a ,
quanhuyen bWHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyenORDER BY maxa;和SELECT maxa ,
COUNT(*) AS tongFROM khaosatWHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'GROUP BY maxa;
3 回答

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
您正在將隱式連接與顯式連接混合使用。這是允許的,但你需要知道如何正確地做到這一點。
問題是,顯式連接(使用JOIN
關鍵字實現(xiàn)的連接)優(yōu)先于隱式連接('逗號'連接,其中連接條件在WHERE
子句中指定)。
以下是您的查詢大綱:
SELECT …FROM a, b LEFT JOIN dkcd ON …WHERE …
您可能希望它的行為如下:
SELECT …FROM (a, b) LEFT JOIN dkcd ON …WHERE …
即,表的組合a
和b
接合用表dkcd
。事實上,正在發(fā)生的事情是
SELECT …FROM a, (b LEFT JOIN dkcd ON …)WHERE …
也就是說,正如您可能已經理解的那樣,只有dkcd
特定的反對b
和聯(lián)接b
,然后結合的結果a
與該WHERE
子句進一步結合并進一步過濾。在這種情況下,a
對該ON
子句中的任何引用都是無效的,此時a
是未知的。這就是您收到錯誤消息的原因。
如果我是你,我可能會嘗試重寫這個查詢,一個可能的解決方案可能是:
SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcdFROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxaWHERE a.maxa <> '99'ORDER BY a.maxa
這里的表格a
,并b
首先連接,然后將結果接合dkcd
?;旧?,這是相同的查詢是你的,只是使用不同的語法的連接,這使得有很大的差別之一:參考a.maxa
中dkcd
的連接條件是現(xiàn)在絕對有效。

慕婉清6462132
TA貢獻1804條經驗 獲得超2個贊
有時,當您以錯誤的方式在查詢中使用架構(dbo)時會發(fā)生此錯誤。
例如,如果你寫:
select dbo.prd.namefrom dbo.product prd
你會得到錯誤。
在這種情況下,將其更改為:
select prd.namefrom dbo.product prd
添加回答
舉報
0/150
提交
取消