3 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
您正在將隱式連接與顯式連接混合使用。這是允許的,但你需要知道如何正確地做到這一點(diǎn)。
問(wèn)題是,顯式連接(使用JOIN
關(guān)鍵字實(shí)現(xiàn)的連接)優(yōu)先于隱式連接('逗號(hào)'連接,其中連接條件在WHERE
子句中指定)。
以下是您的查詢大綱:
SELECT …FROM a, b LEFT JOIN dkcd ON …WHERE …
您可能希望它的行為如下:
SELECT …FROM (a, b) LEFT JOIN dkcd ON …WHERE …
即,表的組合a
和b
接合用表dkcd
。事實(shí)上,正在發(fā)生的事情是
SELECT …FROM a, (b LEFT JOIN dkcd ON …)WHERE …
也就是說(shuō),正如您可能已經(jīng)理解的那樣,只有dkcd
特定的反對(duì)b
和聯(lián)接b
,然后結(jié)合的結(jié)果a
與該WHERE
子句進(jìn)一步結(jié)合并進(jìn)一步過(guò)濾。在這種情況下,a
對(duì)該ON
子句中的任何引用都是無(wú)效的,此時(shí)a
是未知的。這就是您收到錯(cuò)誤消息的原因。
如果我是你,我可能會(huì)嘗試重寫這個(gè)查詢,一個(gè)可能的解決方案可能是:
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
首先連接,然后將結(jié)果接合dkcd
?;旧?,這是相同的查詢是你的,只是使用不同的語(yǔ)法的連接,這使得有很大的差別之一:參考a.maxa
中dkcd
的連接條件是現(xiàn)在絕對(duì)有效。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
有時(shí),當(dāng)您以錯(cuò)誤的方式在查詢中使用架構(gòu)(dbo)時(shí)會(huì)發(fā)生此錯(cuò)誤。
例如,如果你寫:
select dbo.prd.namefrom dbo.product prd
你會(huì)得到錯(cuò)誤。
在這種情況下,將其更改為:
select prd.namefrom dbo.product prd
添加回答
舉報(bào)