2016-06-08 97 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进行多次连接是不可能的。