Есть ли способ выбрать нормализованные данные обратно в один набор результатов - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть три таблицы. Фу, Аттриб, ФуАттриб. Где FooAttrib - это мост между foo и attrib. Как вы можете видеть, в таблице много foo и много атрибутов.

 Foo                 FooAttri                          Attrib
 ------------      -----------------------------     --------------
| id |  Name |    | fooId   |  attribId | value |   | id | Descrip |
|----|-------|    |---------|-----------|-------|   |----|---------|  
|  1 |  Sam  |    |  1      |     1     | red   |   |  1 | Color   |
|  2 |  Bill |    |  1      |     2     | Grape |   |  2 | Flavor  |
|  3 |  Ted  |    |  2      |     1     | Blue  |   |  3 | Weight  |
 ------------     |  3      |     3     |  10   |    --------------
                  |  1      |     3     |   5   |
                  |  2      |     3     |   1   |
                   -----------------------------

Я знаю, как получить следующее:

fooId   Name     Attrib     Value
1       Sam      Color      red     
1       Sam      Flavor     Grape    
1       Sam      Weight     5
2       Bill     Color      Blue
2       Bill     Weight     1
3       Ted      Weight     10

Но я хочу знать; Можно ли построить оператор select так, чтобы я получал все данные foo и attrib, возвращенные в одном наборе результатов, который выглядит следующим образом?

fooId   Name     Color   Flavor   Weight
1       Sam      red     Grape    5
2       Bill     Blue             1
3       Ted                       10

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Вы можете сделать это, если знаете, сколько возможных аргументов вы хотите в выбранное время:

select f.id, f.name, fa_color.value as color, , fa_flavor.value as flavor
from foo f
join fooattri fa_color on f.id = fa_color.fooid and fa_color.attribid = 1
join fooattri fa_flavor on f.id = fa_flavor.fooid and fa_flavor.attribid = 2
...
0 голосов
/ 03 ноября 2011

Попробуйте, у меня обычно работает эта техника:

SELECT fo.id, fo.name, 
  (SELECT fooattri.value 
  FROM fooattri 
    INNER JOIN attrib ON attrib.id = fooattri.attribid 
  WHERE attrib.descrip = 'Color' 
    AND fooattri.fooid = fo.id) AS Color, 
  (SELECT fooattri.value 
  FROM fooattri 
    INNER JOIN attrib ON attrib.id = fooattri.attribid 
  WHERE attrib.descrip = 'Flavor' 
    AND fooattri.fooid = fo.id) AS Flavor, 
  (SELECT fooattri.value 
  FROM fooattri 
    INNER JOIN attrib ON attrib.id = fooattri.attribid 
  WHERE attrib.descrip = 'Weight' 
    AND fooattri.fooid = fo.id) AS Weight 
FROM foo fo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...