2014-10-30 34 views
-1

我現在有這個說法......SQL服務器:集團內連接來單獨列

SELECT * 
FROM stock AS s 
INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code 

此輸出這樣的信息...

| stock_code | attribute name | attribute value | 
|------------|----------------|-----------------| 
| ABC01 |  color  |  red  | 
| ABC01 |  size  |  small  | 
| ABC01 |  price  |  10.0  | 
| XYZ99 |  color  |  blue  | 
| XYZ99 |  size  |  large  | 
| XYZ99 |  price  |  50.0  | 

但是我希望它看起來像這樣

| stock_code |  color  |  size  |  price  | 
|------------|----------------|-----------------|------------------| 
| ABC01 |  red  |  small  |  10.0  | 
| XYZ99 |  blue  |  large  |  50.0  | 

我發現許多這樣的例子對SO,但他們似乎是非常準確的複雜的例子,我確信一個函數會存在於我想要達到的上面。

目前我在多個INNER JOIN s中使用SELECT來實現這個功能,以選擇屬性名稱,但是這需要在創建新屬性名稱時手動修改。

非常感謝提前!

+0

這就是爲什麼屬性表是一個壞主意,它們很難查詢。你真正需要做的是正確地重新檢查你的數據庫。 EAV表只適用於你在deagin時間無法預測的事情,如果你需要大量的信息,你應該根本不使用真實的數據庫。他們不僅難以查詢,他們可能是性能殺手。 – HLGEM 2014-10-30 14:15:44

+1

在谷歌上查看:旋轉表。 – 2014-10-30 14:16:28

+0

*但是這需要在創建新屬性名稱時手動修改*您可以對此做很多事情。這是實體屬性值設計的成本之一。你可能需要做動態查詢,或者在添加屬性時做代碼生成 – 2014-10-30 14:17:02

回答

0

如果您可以忍受限制,每次添加新屬性都必須更改代碼,那麼解決方案非常簡單。

CREATE VIEW STOCK_COLOURS AS SELECT STOCK_CODE, STOCK_VALUE FROM STOCK_ATTRIBUTES WHERE ATTRIBUTE_NAME = 'colour

每個創建的這些一個屬性,你需要在你的主查詢加入。

+0

這看起來不錯,我怎麼會有這個相同的答案,以顯示「色」列和'大小'列雖然? – 2014-10-30 14:30:32

+0

創建另一個名爲'STOCK_SIZES'的視圖,另一個名爲'STOCK_PRICES'等的視圖... – 2014-10-30 14:34:46

1

CASE基於聚合可以用來做支點

SELECT stock_code, 
      MAX(case when attribute name='color' then attributevalue end) as color, 
      MAX(case when attribute name='size' then attributevalue end) as size, 
      MAX(case when attribute name='price' then attributevalue end) as price 
    FROM Table1 
    GROUP BY stock_code 
1

好了,所以不能完全被回答過的問題,因爲我需要但定義名稱使用即時通訊這個...(其中只有一個SELECT語句)

SELECT * FROM (
    SELECT * 
    FROM stock AS s 
    INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code 
) AS MyData 
PIVOT(
    MAX(attibute_value) 
    FOR attribute_name IN ("Color", "Size", "Price") 
) AS MyPivotData 
+1

+1,這是正確的。現在,如果您不知道所有可能的值,則需要使用動態sql來構建它。這裏是例子。 http://stackoverflow.com/questions/26262720/sql-how-to-do-a-pivot-of-one-column-regardless-of-the-data/26262804#26262804 – radar 2014-10-30 16:10:48