从其他表的数据创建新表

时间:2010-01-27 19:54:10

标签: sql

我是SQL的新手,我希望有人可以帮助我学习一些SQL语法。我有一个包含这些表和字段的数据库,

  • DATA:data_id,person_id,attribute_id,date,value
  • PERSONS:person_id,parent_id,name
  • ATTRIBUTES:attribute_id,attribute_type

attribute_type可以是“Height”或“Weight”

问题1

给一个人的“姓名”,我想为每个孩子返回一个“重量”测量表。即:如果约翰有三个孩子的名字,爱丽丝,鲍勃和卡罗尔,那么我想要一个这样的表

| date | Alice | Bob | Carol |

我知道如何获得这样一长串孩子的体重:

select d.date, 
       d.value 
  from data d, 
       persons child, 
       persons parent, 
       attributes a 
 where parent.name='John' 
   and child.parent_id = parent.person_id 
   and d.attribute_id = a.attribute_id 
   and a.attribute_type = "Weight';

但我不知道如何创建一个看起来像的新表:

| date | Child 1 name | Child 2 name | ... | Child N name |

问题2

另外,我想选择属于某个范围的属性。

问题3

如果孩子的日期不一致会怎样?例如,假设爱丽丝比鲍勃年长3岁,那么在爱丽丝生命的前3年里,鲍勃没有数据。如果我们请求所有数据,数据库如何处理这个?

2 个答案:

答案 0 :(得分:2)

1)可能不那么容易。 MS SQL Server可以PIVOT一个轴上的表,但是将结果集转储到一个数组并在那里进行排序(假设这与某种程序有关)可能是现在更简单的方法,如果你是SQL的新手

如果您可以设法在SQL中执行它仍然不足以创建新表,只返回您用来填充它的数据,因此可能需要某种外部操作。但您可以使用INSERT INTO [new table] SELECT [...]从选择查询中填充新表,至少。

2)您可以为{1}}加入每个唯一属性:

attributes

(您加入原始查询的方式只是SELECT [...] FROM data AS d JOIN persons AS p ON d.person_id = p.person_id JOIN attributes AS weight ON p.attribute_id = weight.attribute_id HAVING weight.attribute_type = 'Weight' JOIN attributes AS height ON p.attribute_id = height.attribute_id HAVING height.attribute_type = 'Height' [...] 的简写,同样的事情,除非您需要[INNER] JOIN .. ON子句在那里)

3)这取决于你用来匹配父/子关系的HAVING的类型,以及你在JOIN中过滤的任何日期,如果我正在读的那样(完全是可能我不是)。我不太确定你在寻找什么,或者你正在使用什么样的数据库,所以没有好的答案。如果你对SQL足够新,你不知道WHERE的不同类型以及它们可以做什么,那么learn them非常值得 - 他们把R放在RDBMS中。

答案 1 :(得分:0)

执行选择时,需要指定所需的确切列。换句话说,你不能返回第N个孩子的名字。即这是不可能的:

1/2/2010 | Child_1_name | Child_2_name | Child_3_name
1/3/2010 | Child_1_name 
1/4/2010 | Child_1_name | Child_2_name 

每条记录都需要具有相同数量的列。所以你可以选择这样做:

1/2/2010 | Child_1_name
1/2/2010 | Child_2_name
1/2/2010 | Child_3_name
1/3/2010 | Child_1_name 
1/4/2010 | Child_1_name
1/4/2010 | Child_2_name

然后在报告中将其重新映射到您希望如何显示