3 Таблица, SQL-запрос - PullRequest
       2

3 Таблица, SQL-запрос

3 голосов
/ 24 января 2012

Я пытаюсь написать запрос SQL, который извлекает из 3 таблиц и не смог достичь нужных мне результатов. Я хочу вернуть все имена свойств (метки), которые связаны с определенной категорией, и сопоставить эти свойства со значениями определенного актива из указанной категории, которые могут не иметь значения для сопряжения с каждым свойством.

Я хочу все свойства категории 4 в сочетании со значениями актив 135 . Для актива 135 не заданы значения для свойства 3 или 4, поэтому я хочу:

| property_name | property_value     |  
|:--------------|:-------------------|  
| Fixture ID    | A5                 |  
| Manufacturer  | Black & Decker     |  
| Model #       |                    |  
| Type          |                    |

Вот мой запрос:

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

результирующие данные :

| property_name | property_value     |  
|:--------------|:-------------------|  
| Fixture ID    | A5                 |  
| Manufacturer  | Black & Decker     |  

В нем отсутствуют 2 свойства из-за моего AND asset_property.asset_id = 135

Вот таблицы : * звездочка просто указывает строки из тестового примера.

таблица: свойство

| property_id | property_name |  
|:-----------:|:--------------|  
| 1           | Fixture ID    |*  
| 2           | Manufacturer  |*  
| 3           | Model #       |*  
| 4           | Type          |*  
| 5           | Lamp Type     |  

таблица: 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             |  

таблица: категория_свойства
пары категорий с его свойствами.

| category_id | property_id |  
|:-----------:|:-----------:|  
| 4           | 1           |*  
| 4           | 2           |*  
| 4           | 3           |*  
| 4           | 4           |*  
| 7           | 2           |  
| 7           | 5           |  

Я пробовал все разные типы JOIN, HAVING, GROUP BY .... не могу понять. Если кто-нибудь поймет, что мне нужно, я очень признателен за помощь! Спасибо!


Чтобы уточнить, мне нужно вернуть эти наборы результатов:

| property_name |  
|:--------------|  
| Fixture ID    |  
| Manufacturer  |  
| Model #       |  
| Type          |  

И

| property_value |  
|:---------------|  
| A5             |  
| Black & Decker |  

И присоединиться к ним на property_id:

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  
| Model #       |  
| Type          |  

Но поскольку в asset_property table нет записи для property_id 4 и 5, property_name для этих свойств не отображается.

| property_name | property_value |  
|:--------------|:---------------|  
| Fixture ID    | A5             |  
| Manufacturer  | Black & Decker |  

Модель #
Тип

Я хочу, чтобы они были показаны. Я хочу, чтобы ALL имена свойств для категории 4 были возвращены и согласованы с любыми соответствующими значениями property_values ​​для актива 135 .


Итак, для категории Фрукты Я хочу вернуть все имена свойств (Цвет, Сезон, Вкус). Свойство color для Apple не задано, но я все же хочу, чтобы все типы свойств были возвращены, чтобы их можно было изменить или заполнить:

| property_name | property_value |  
|:--------------|:---------------|  
| Color         |                |  
| Season        | Fall           |  
| Taste         | Tart           |  

1 Ответ

5 голосов
/ 24 января 2012

Просто измените INNER JOIN на 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
;

(Я также изменил первый LEFT OUTER JOIN на INNER JOIN, так как WHERE category_property.category_id = 4 будет (правильно) отфильтровывать записи, где соединение не будет выполнено.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...