【问题标题】:One to many relation and subqueries一对多关系和子查询
【发布时间】:2013-11-19 06:47:44
【问题描述】:

我有一张桌子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

谢谢,

马哈茂德

【问题讨论】:

  • 欢迎来到 SO,请添加您尝试过的代码,其他人会提供帮助...

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


【解决方案1】:

你可以

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') 

但这不会有太大的不同。

【讨论】:

  • 非常感谢 SQB。这就是我想要的。
  • 对于任意数量的列,我可以在我的编程语言中使用循环来构建查询的可变部分。然后在数据库上执行最终查询。
  • 这确实是一个选择。我的意思是 just SQL 没有办法做到这一点。
  • 是否可以制作一个中间视图来构建一个以property_names作为列名的新表,然后对其运行查询
  • 不。视图或多或少是一个编码查询,所以如果它在查询中不可行,它在视图中也不可行。您还有其他事情可以做,我会将其添加到我的答案中。
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2014-07-14
  • 2015-03-31
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多