一对多关系和子查询

时间:2013-11-19 06:47:45

标签: sql sqlite database-design subquery one-to-many

我有一张表persons(id, fist, last)和另一张表properties(person_id, property_name, property_value)

每个人可能有许多(未定义)属性,这些属性的名称可能会根据用户的收藏而有所不同。例如,对于这些记录,我们需要以下输出:

properties
==========
person_id  property_name  property_value
----------------------------------------
1          Gender         Male
1          Education      Under

person
======
id  first  last
----------------
1   John   Smith

result
======
id  First  Last   Gender  Education
-----------------------------------
1   John   Smith  Male    Under

有没有一种简单的方法可以在不使用查询数据库的几个步骤的情况下完成此操作?我的意思是使用子查询,加入,分组或任何其他必要的工作来完成这项工作?

PS。我正在使用sqlite2& 3

谢谢,

马哈茂德

1 个答案:

答案 0 :(得分:2)

你可以做到

SELECT
  pers.id,
  pers.first,
  pers.last,
  gender.property_value AS gender,
  edu.property_value AS education
FROM person pers
LEFT JOIN properties gender 
  ON (gender.person_id = pers.id AND gender.property_name = 'Gender') 
LEFT JOIN properties edu
  ON (edu.person_id = pers.id AND edu.property_name = 'Education') 

但是无法为任意数量的列执行此操作。您需要知道所需的列并相应地加入。

可以做什么,是事先用另一种语言动态构建查询,然后执行该查询。如果您这样做,使用参数。请?

如果需要,您可以创建一个显示person_ids所有属性的视图:

CREATE VIEW all_properties (
  person_id,
  gender,
  education
)
AS SELECT
  pers.person_id,
  gender.property_value,
  edu.property_value
FROM (SELECT DISTINCT person_id FROM properties) pers
LEFT JOIN properties gender 
  ON (gender.person_id = pers.person_id AND gender.property_name = 'Gender') 
LEFT JOIN properties edu
  ON (edu.person_id = pers.person_id AND edu.property_name = 'Education') 

但这并没有太大的区别。