我是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”
给一个人的“姓名”,我想为每个孩子返回一个“重量”测量表。即:如果约翰有三个孩子的名字,爱丽丝,鲍勃和卡罗尔,那么我想要一个这样的表
| 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 |
另外,我想选择属于某个范围的属性。
如果孩子的日期不一致会怎样?例如,假设爱丽丝比鲍勃年长3岁,那么在爱丽丝生命的前3年里,鲍勃没有数据。如果我们请求所有数据,数据库如何处理这个?
答案 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
然后在报告中将其重新映射到您希望如何显示