2012-03-19 79 views
-3
SELECT * FROM Products_Joined, Products 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

我不斷收到錯誤多部分標識符p.ProductManufacturer無法綁定多部分標識符無法綁定

我想:

  • 設置Order By
  • PRODUCTS表添加到FROM

有什麼我失蹤了嗎?

+5

該查詢中定義了哪個「p」? (提示:不是)你也錯過了一個連接條件。 – 2012-03-19 14:26:29

+0

你能說清楚你試圖用這個查詢來完成什麼嗎?例如,所需的輸出結果。 – ImGreg 2012-03-19 14:28:06

+0

當我用Products.ProductManufacturer – henryaaron 2012-03-19 14:28:08

回答

1

您沒有p對象。你需要別名你的一個表。

SELECT * FROM Products_Joined, Products AS p 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

這將能夠立即解決的問題,但是你應該有你的表,否則你正在做一個CROSS JOIN,這通常是不理想的一個JOIN。下面是一個例子。如果你即使有Products.ProductManufacturer收到錯誤,那麼你可能缺少Products表中的列ProductManufacturer

SELECT * 
FROM Products_Joined 
    JOIN Products AS p 
     ON Products_Joined.ProductsID = p.ProductsID 
--This join is a guess on what the common column is between these two tables 
--Change as necessary 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

UPDATE基於您的評論

。我會檢查你的模式並確認列存在。

+1

交叉連接檢測到lol – 2012-03-19 14:28:52

+0

@DenisValeev當然,我注意到了。我不打算爲他重寫查詢,因爲我不知道要加入什麼,所以只需將它留給代碼即可。我已經使用猜測更新了示例 – 2012-03-19 14:36:03

3

你應該使用:

SELECT p.*, pj.* 
FROM dbo.Products p 
INNER JOIN dbo.ProductsJoined pj ON ..... <== add your missing JOIN condition here 
WHERE p.ProductManufacturer = 'Sony' 
ORDER BY p.ProductCode 

首先:從來沒有在您的生產代碼中使用SELECT *

其次:使用正確的ANSI JOIN語法INNER JOIN..)清楚地表明要加入什麼,和什麼JOIN條件(其中缺少你的情況 - 你在這裏產生一個笛卡爾乘積。 ....)

第三:如果您使用像p.這樣的表別名 - 您還需要定義它們!

+0

「在您的生產代碼中從不使用SELECT *」 - 「對於任何人告訴您永遠不要在SQL中執行任何操作時,請始終保持警惕。[在以下示例中](http:// stackoverflow .com/a/9328000/15354),SELECT *不會造成任何傷害,並且在可讀性和代碼維護方面可以說是有益的。「 – onedaywhen 2012-03-21 11:05:01

+0

@onedaywhen:那些是非常罕見的邊緣案例 - 即使如此 - 在使用SELECT *時也沒有**好處 - 您也可以鍵入問題的列 - 我總是建議做 – 2012-03-21 12:31:42

+0

示例是簡化但通用形式。好處是您不必再次輸入它們(DRY),這樣可以減少錯誤的發生,特別是在以後添加列時。但強迫用戶總是輸入逗號列表非常嚴格。說到嚴格:笛卡爾積的結果是一組有序對,而不是關係/表。 OP的語法不僅是ANSI SQL,也是ISO SQL。文獻使用術語「範圍變量」來表示SQL標準爲所謂的「別名」所稱的「相關名稱」;) – onedaywhen 2012-03-21 13:16:59

相關問題