亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法綁定多部分標識符

無法綁定多部分標識符

守候你守候我 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;當我執行此查詢時,錯誤結果為: 無法綁定多部分標識符“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關鍵字實現的連接)優先于隱式連接('逗號'連接,其中連接條件在WHERE子句中指定)。

以下是您的查詢大綱:

SELECT
  …FROM a, b LEFT JOIN dkcd ON …WHERE …

您可能希望它的行為如下:

SELECT
  …FROM (a, b) LEFT JOIN dkcd ON …WHERE …

即,表的組合ab接合用表dkcd。事實上,正在發生的事情是

SELECT
  …FROM a, (b LEFT JOIN dkcd ON …)WHERE …

也就是說,正如您可能已經理解的那樣,只有dkcd特定的反對b和聯接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.maxadkcd的連接條件是現在絕對有效。


查看完整回答
反對 回復 2019-08-02
?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

有時,當您以錯誤的方式在查詢中使用架構(dbo)時會發生此錯誤。

例如,如果你寫:

select dbo.prd.namefrom dbo.product prd

你會得到錯誤。

在這種情況下,將其更改為:

select prd.namefrom dbo.product prd


查看完整回答
反對 回復 2019-08-02
  • 3 回答
  • 0 關注
  • 682 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號