2013-02-11 67 views
1

嘿傢伙我很接近能夠代表我想要顯示的數據 有問題的列是a.state_Id。 我從我所做的研究中瞭解到,a.State_Id超出了範圍。我的sql語句缺失的是什麼?在子句錯誤中的未知列

如果我拿出a.State_ID = c.State_Id只留下b.Product_Id = c.Product_Id然後顯示數據,但我需要匹配狀態和產品。

我知道我需要添加另一個join某處,但我不知道如何。如果任何人都可以幫助我,那真是太棒了!

SELECT a.state_id, 
     a.state_name, 
     a.state_abbreviatedname, 
     b.product_id, 
     b.product_name, 
     c.stateproduct_price 
FROM states a, 
     products b 
     LEFT OUTER JOIN stateproducts c 
ON a.state_id = c.state_id AND b.product_id = c.product_id 

更新1

的狀態表已被填充幷包含以下字段:

State_Id 
State_Name 
State_AbbreviatedName 

已被填充到包含基本產品的產品表。該表具有以下字段:

Product_Id 
Product_Name 

每個國家都會有相同的產品但價格與每個國家每個產品的變化。這就是爲什麼我有StateProducts表。這張表是空的,並且將通過我創建的接口逐個填充。狀態產品表將具有以下字段

State_Id //reference/relational field to be user for comparison 
Product_Id //reference/relational field to be user for comparison 
StateProduct_Price //new field 

所以我明白,我會收到價格欄中的NULL值。

我已經能夠返回一種Cartesion產品的狀態和產品表。不過,我現在需要爲此cartesion表右側的每個組合添加價格。 記住stateproducts表是空的我將如何實現這一目標?

+0

請停止混合顯式和隱式'JOIN's。 – Kermit 2013-02-11 15:51:17

+0

njk,我是一個不是數據庫設計師的ios程序員。我目前正試圖理解這一切。如果你可以通過不混合顯式和隱式連接來解釋你的意思,並告訴我們它們是如何寫成對我有教育意義的。謝謝 – Pavan 2013-02-11 15:54:25

+1

@Pavan:請參閱http://en.wikipedia.org/wiki/Join_%28SQL%29#Inner_join或http://stackoverflow.com/questions/44917/explicit-vs-implicit-sql-joins討論隱式和顯式連接的區別。 – 2013-02-11 15:57:33

回答

2

我猜你有Many-to-Many關係,其中States可以有多個ProductsProducts可以在不同的States。因此,您需要將States加入映射表StateProducts,以便您可以在表Products上獲得產品。

SELECT a.State_ID, 
     a.State_Name, 
     a.State_AbbreviatedName, 
     b.Product_Id, 
     b.Product_Name, 
     c.StateProduct_Price 
FROM States a 
     INNER JOIN StateProducts c 
      ON a.State_ID = c.State_Id 
     INNER JOIN Products b 
      ON b.Product_Id = c.Product_Id 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

更新1

使用CROSS JOIN關鍵字,

SELECT a.state_id, a.state_name, a.state_abbreviatedname, b.product_id, b.product_name, c.stateproduct_price 
FROM states a 
     CROSS JOIN products b 
     LEFT OUTER JOIN stateproducts c 
      ON a.state_id = c.state_id AND 
      b.product_id = c.product_id 
+0

嗨JW,你的sql語句沒有產生任何錯誤,但它產生了一個空集。我希望返回一個包含表狀態和產品cartesion產品的集合,並且爲每個產生的組合添加StateProducts表中的價格。如果價格不存在,只需在特定行的Price列中返回NULL,並且存在的任何行都可顯示該當前組合的價格。希望我已經說清楚了。如果你可以檢查我更新的帖子,它可能會有幫助。由於JW – Pavan 2013-02-11 16:35:22

+0

關於如何使用關鍵字'CROSS JOIN'而不是逗號,例如'選擇a.state_id, a.state_name, a.state_abbreviatedname, b.product_id, b.product_name, c.stateproduct_price 各國a CROSS JOIN products b LEFT OUTER JOIN stateproducts c ON a.state_id = c.state_id AND b.product_id = c.product_id' – 2013-02-11 16:37:24

+0

嗨JW,您在上面的評論中寫的是我一直試圖檢索的數據集。如果您可以更新您的帖子,以便我可以將此問題標記爲已回答。 HAH ..好像它只是需要在這種情況下改變逗號的字母!謝謝你的幫助JW – Pavan 2013-02-11 16:52:02

0

嘗試FROM子句中像這樣寫:

from StateProducts c join 
    States a 
    on c.state_id = c.state_id join 
    Products b 
    on c.product_id = b.product_id 

對於笛卡爾乘積(即,使各國和產品的所有例子):從A到C

SELECT s.state_id, s.state_name, s.state_abbreviatedname, 
     p.product_id, p.product_name, 
     sp.stateproduct_price 
from States s cross join 
    Products p left outer join 
    StateProducts sp 
    on sp.state_id = s.state_id and 
     sp.product_id = p.product_id 
+0

我感謝您花時間回答。戈登這返回一個空集,我試圖從另一個表基於依賴於state_id和product_id的組合檢索笛卡爾集。在我更新的帖子看看 – Pavan 2013-02-11 16:15:01

2

, C到B.

通過對每個進行LEFT JOIN,您仍然會以所有可能的狀態結束,而不管有沒有實際的狀態產品。

SELECT 
     a.State_ID, 
     a.State_Name, 
     a.State_AbbreviatedName, 
     b.Product_Id, 
     b.Product_Name, 
     c.Product_Price 
    FROM 
     States a 
     LEFT JOIN StateProducts c 
      ON a.State_ID = c.State_Id 
      LEFT JOIN Products b 
       ON c.Product_Id = b.Product_Id 
+0

DRapp感謝張貼,我得到這個錯誤與你提出的解決方案: #1064 - 你在你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在'a.State_ID = c.State_Id LEFT JOIN產品b ON c'附近使用正確的語法。在第11 如果你可以看看我更新的帖子這樣你就可以得到更多的信息,所以你可以那麼也許修改你的SQL語句 – Pavan 2013-02-11 16:30:02

+0

@pavan,一邊看着你修改結構,看來你開始「StateProduct_Price」而不是「Product_Price」。我修改了查詢,但這可能是您和其他人遇到的情況,因爲他們都使用「StateProduct_Price」列。 – DRapp 2013-02-11 16:35:55

+0

我看到你剛剛更改了行名?該名稱可以是任何內容,但爲了便於閱讀,我選擇了StateProduct_Price,因爲它是每個州獨有的產品價格。不過你有沒有看過我對你的帖子的第一條評論?你的sql語句產生一個錯誤。 – Pavan 2013-02-11 16:41:46

相關問題