2014-10-30 32 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