有兩個表如下:
表1:Person
field 1: Id
field 2 : Name
表2:Person_Attribute
field 1: person_id
field 2: attribute_name
field 3 : attribute_value
Person_Attribute 表 attribute_name field 之枚舉值 為:gender,nationality.
請問列出所有 gender ='male' 且 nationality='chinese' 之person之SQL語句。
SELECT p.* FROM person p
WHERE EXISTS
(
SELECT 1 FROM person_attribute pa
WHERE p.id=pa.person_id AND pa.attribute_name='gender' AND pa.attribute_value='male'
)
AND EXISTS
(
SELECT 1 FROM person_attribute pa
WHERE p.id=pa.person_id AND pa.attribute_name='nationality' AND pa.attribute_value='chinese'
)
order by p.name
表结构这样设计会导致查询比较麻烦,如果数据量很大,可能会出现性能问题,如果业务已经很明确,还是建议把属性字段直接建在person表上
select * from (select p.id, p.name from person p
left join (select a1.id, a1.attribute_value as gender Person_Attribute a1 where a1.attribute_name = "gender") a2 on p.id = a2.id
left join (select a3.id, a3.attribute_value as nationality Person_Attribute a3 where a3.attribute_name = "nationality") a4 on p.id = a4.id)
where a2.gender ='male' and a4.nationality='chinese'