什么SQL查询将获得所需的结果?

时间:2018-06-13 17:49:39

标签: sql sql-server tsql

*编辑* RDBMS是SQL Server 2012

我有一个存储客户数据的程序。 '客户'是一个具有一些标准属性的对象(例如名称,性别等)。但是,我希望允许程序用户向“客户”添加自定义属性。 (例如眼睛颜色,身高)。

我创建了三个包含以下数据的表:

tblCustomers

customer_id | name | sex
------------+------+-----
          1 | Max  | M
          2 | Tim  | M

tblProperties

property_id | label
------------+------
          1 | Height  
          2 | Weight
          3 | EyeColor

tblPropertyValues

obj_id | prop_id | prop_value
-------+---------+-----------
     1 |       1 |         60 
     1 |       2 |         84 
     1 |       3 |      Green 
     2 |       1 |         72 
     2 |       2 |         94 

我想知道一个查询来创建以下结果集:

Customer | Property | Value
---------+----------+------
     Max | Height   |   60
     Max | Weight   |   84
     Max | EyeColor | Green
     Tim | Height   |   72
     Tim | Weight   |   94
     Tim | EyeColor | NULL

2 个答案:

答案 0 :(得分:2)

CROSS JOIN需要LEFT JOIN

select c.name as Customer, p.label as Property, pv.prop_value
from tblCustomers c cross join
     tblProperties p left join
     tblPropertyValues pv
     on pv.obj_id = c.customer_id and pv.prop_id = p.property_id;

答案 1 :(得分:0)

这可以做你想要的,只要我猜对了你的桌子关系。

SELECT c.name AS customer, p.label AS property, v.prop_value AS value
FROM tblCustomer c
INNER JOIN tblPropertyValues v ON v.obj_id = c.customer_id
INNER JOIN tblProperties p ON p.property_id = v.prop_id
ORDER BY 1, 2

编辑:我使用的ORDER BY子句与您按预期显示的数据顺序不匹配。我不确定它的基础,所以我不会尝试调整。