2016-06-08 48 views
-1
-- MS ACCESS sql to present row based data as column based 
-- Gives too many rows probably Cartesian product. If I have 5 toys with one color and one weight each I expect 5 rows, but get more 
SELECT 
t.ToyId 
,t.ToyName 
,p1.TextValue as 'Color' 
,p2.FloatValue as 'Weight' 
FROM (my_toys t 
LEFT OUTER JOIN properties p1 ON (t.ToyId = p1.ToyId) AND (p1.propertyId='Color'))) 
LEFT OUTER JOIN properties p2 ON (t.ToyId = p2.ToyId) AND (p2.propertyId='Weight')) 

我在MS Access SQL中演示未來的MySQL數據庫。我有一張玩具的桌子,我有一張桌子,像顏色,重量,長度等屬性。屬性表中的每一行代表一個玩具的屬性,所以它是一個基於行的存儲。屬性表中的行的示例可以是:MS Access的SQL - 多個連接與AND給笛卡爾產品?

  • 玩具= 1; ProperyType = '顏色'; TextValue = '藍';的floatValue = NULL;
  • 玩具= 1; ProperyType ='Weight'TextValue = null;的floatValue = 42;
  • Toy = 1; ProperyType ='Length'TextValue = null;的floatValue = 123;
  • Toy = 2; ProperyType ='Color'; TextValue = '紅色';的floatValue = NULL;

當我設法得到語法正確上面的SQL給人不是每個玩具一行與顏色和重量,而是笛卡爾乘積列,至少有太多的行。這個sql問題的目的是爲了獲得更好的人類可讀性,將基於行的數據模型轉換爲基於列的數據模型。

我已經爲MySQL中的視圖製作了類似的結構,但是我無法理解我在MS Access SQL代碼中犯的錯誤。誰能幫我嗎?

(請注意我的實際項目不是玩具,因此代碼可能包含一些打字錯誤)

+0

我不習慣於EAV結構,但是如果你希望輸出每個玩具只顯示一行,我認爲你需要一個GROUP BY子句。 – MoondogsMaDawg

+1

括號看起來不正確。 我數5(和7) – AntDC

+0

我知道訪問愛添加)它可能是一個操作問題的順序。你可以刪除它們或使用子選擇嗎? – xQbert

回答

0

左邊的複合條件聯接可能導致問題與操作對()的訪問順序增加...

SELECT 
t.ToyId 
,t.ToyName 
,p1.TextValue as 'Color' 
,p2.FloatValue as 'Weight' 
FROM my_toys t 
LEFT OUTER JOIN (Select * from properties where p1.propertyId='Color') p1 
    ON t.ToyId = p1.ToyId 
LEFT OUTER JOIN (Select * from properties where p2.propertyId='Weight') p2 
    ON t.ToyId = p2.ToyId 
0

謝謝xQbert,我試過你的解決方案。當我仍然有太多的行時,我真的再次查看了我的數據表,結果證明我有另一個標識符給「玩具」,我們稱之爲所有者。所以實際上每個ToyId都有不止一個玩具,所以這一路都是我的錯誤。但是,如果我沒有得到你的解決方案,我會拋棄Access作爲beeing無法使用!

還要感謝所有意見,從這個問題我學到了一些東西。

  1. 我現在可以在MS Access SQL中對subquerys進行連接和連接!
  2. 在發送問題給你們之前,我總是會做一個簡單的,準確的例子。然後我可以找到我自己愚蠢的錯誤,並且有工作代碼和示例數據庫進行測試。
  3. 我不應該不信任MS Access SQL!在這個例子中,我首先想到的是由於語言的限制,使用AND進行多次連接是不可能的。