我正在尝试编写一个从3个表中提取的SQL查询,但无法实现我需要的结果.我想返回与特定类别配对的所有属性名称(标签),并将这些属性与来自所述类别的特定资产的值配对,这些值可能没有与每个属性配对的值.
我想要类别4的所有属性,与资产135的值配对.资产135没有为属性3或4设置的值,所以我想要:
| property_name | property_value |
|:--------------|:-------------------|
| Fixture ID | A5 |
| Manufacturer | Black & Decker |
| Model # | |
| Type | |
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
SELECT property.property_name, asset_property.property_value
FROM property
LEFT OUTER JOIN category_property
ON property.property_id = category_property.property_id
INNER JOIN asset_property
ON asset_property.property_id = property.property_id
WHERE category_property.category_id = 4
AND asset_property.asset_id = 135
Run Code Online (Sandbox Code Playgroud)
结果数据:
| property_name | property_value |
|:--------------|:-------------------|
| Fixture ID | A5 |
| Manufacturer | Black & Decker |
Run Code Online (Sandbox Code Playgroud)
由于我的原因,它缺少了2个属性 AND asset_property.asset_id = 135
以下是表格:*星号表示测试用例中的行.
表:财产
| property_id | property_name |
|:-----------:|:--------------|
| 1 | Fixture ID |*
| 2 | Manufacturer |*
| 3 | Model # |*
| 4 | Type |*
| 5 | Lamp Type |
Run Code Online (Sandbox Code Playgroud)
table:asset_property
将资产与属性值配对.
| asset_id | property_id | property_value |
|:--------:|:-----------:|:---------------|
| 129 | 1 | A5 |
| 129 | 2 | Black & Decker |
| 129 | 3 | 1230-02 |
| 129 | 4 | Incandescent |
| 135 | 1 | E6 |*
| 135 | 2 | Linden |*
| 147 | 1 | G1 |
Run Code Online (Sandbox Code Playgroud)
table:category_property
将类别与其属性配对.
| category_id | property_id |
|:-----------:|:-----------:|
| 4 | 1 |*
| 4 | 2 |*
| 4 | 3 |*
| 4 | 4 |*
| 7 | 2 |
| 7 | 5 |
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有不同的JOIN类型,HAVING,GROUP BY ......无法弄明白.如果有人理解我的需要,我真的很感激帮助!谢谢!
为了澄清,我需要返回以下结果集:
| property_name |
|:--------------|
| Fixture ID |
| Manufacturer |
| Model # |
| Type |
Run Code Online (Sandbox Code Playgroud)
和
| property_value |
|:---------------|
| A5 |
| Black & Decker |
Run Code Online (Sandbox Code Playgroud)
加入他们property_id:
| property_name | property_value |
|:--------------|:---------------|
| Fixture ID | A5 |
| Manufacturer | Black & Decker |
| Model # |
| Type |
Run Code Online (Sandbox Code Playgroud)
但是,由于不存在用于记录property_id在图4和5 asset_property table中,property_name对于那些性质未示出.
| property_name | property_value |
|:--------------|:---------------|
| Fixture ID | A5 |
| Manufacturer | Black & Decker |
Run Code Online (Sandbox Code Playgroud)
型号
#Type
我希望他们能够展示出来.我希望返回类别4的所有属性名称,并与资产135的任何匹配的property_values配对.
因此,对于水果类别,我想要返回所有属性名称(颜色,季节,味道).Apple的color属性未设置,但我仍然希望返回所有属性类型,因此可以更改或填写它们:
| property_name | property_value |
|:--------------|:---------------|
| Color | |
| Season | Fall |
| Taste | Tart |
Run Code Online (Sandbox Code Playgroud)
只需INNER JOIN将a 更改为a LEFT OUTER JOIN,然后AND asset_property.asset_id = 135从WHERE子句移动到ON子句:
SELECT property.property_name,
asset_property.property_value
FROM property
INNER
JOIN category_property
ON property.property_id = category_property.property_id
LEFT
OUTER
JOIN asset_property
ON asset_property.property_id = property.property_id
AND asset_property.asset_id = 135
WHERE category_property.category_id = 4
;
Run Code Online (Sandbox Code Playgroud)
(我还将第LEFT OUTER JOIN一个更改为a INNER JOIN,因为WHERE category_property.category_id = 4意志(正确)过滤掉了连接失败的记录.无论如何.)