SQL для генерации отчета о структурированных данных атрибут-сущность - PullRequest
0 голосов
/ 17 апреля 2009

У меня есть 3 таблицы:

Productmaster:

ProductId    PName     PDescription

Атрибуты:

AttributeID  attName
----         ----
1            Brand
2            Category
3            Artist

ProductAttributeValues ​​

paId   ProductId  AttributeID AttributeValues

A product может иметь несколько attributes.

Вот желаемый вывод:

ProductId  ProductDesc  Brand    Category    Artist
---        ---          ---      ---         ---
1          sadasd       Brand1   Category1   Artist1
2          sadasds      Brand2   Category3   Artist4

Как я могу получить этот вывод?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 17 апреля 2009

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

select p.ProductId,p.ProductDesc,
a1.AttributeValues as Brand,
a2.AttributeValues as Category, 
a3.AttributeValues as Artist,
from Product p
left join ProductAttributeValues a1 on(p.ProductId=a1.ProductId and a1.AttributeID=1)
left join ProductAttributeValues a2 on(p.ProductId=a2.ProductId and a2.AttributeID=2)
left join ProductAttributeValues a3 on(p.ProductId=a3.ProductId and a3.AttributeID=3)

Чтобы перевести это обратно на английский, «дайте мне все товары, и для каждого из них, дайте мне бренд, категорию и артиста, если они существуют»

Я предположил, что у продукта есть только одно или нулевое значение для каждого атрибута.

1 голос
/ 17 апреля 2009

Предполагается, что каждый атрибут появляется ровно один раз для каждого продукта:

SELECT 
  pm.ProductId as ProductId,
  pm.PDescription as ProductDesc,
  pav_Brand.AttributeValues as Brand,
  pav_Category.AttributeValues as Category,
  pav_Artist.AttributeValues as Artist
FROM
  ProductMaster pm
    inner join ProductAttributeValues pav_Brand 
      on pm.productId == pav_Brand.ProductId
    inner join Attributes a_Brand 
      on pav_Brand.AttributeId = a_Brand.AttributeId
        AND a_Brand.attName = 'Brand'
    inner join ProductAttributeValues pav_Category 
      on pm.productId == pav_Category.ProductId
    inner join Attributes a_Category 
      on pav_Category.AttributeId = a_Category.AttributeId
        AND a_Brand.attName = 'Category'
    inner join ProductAttributeValues pav_Artist 
      on pm.productId == pav_Artist.ProductId
    inner join Attributes a_Artist 
      on pav_Category.AttributeId = a_Artist.AttributeId
        AND a_Brand.attName = 'Artist'

Вы можете использовать левые внешние соединения, если данные не всегда доступны.

0 голосов
/ 17 апреля 2009
SELECT  ProductId, ProductDesc,
        (
        SELECT  AttributeValues
        FROM    ProductAttributeValues pv
        WHERE   pv.AttributeID = 1
                AND pv.ProductID = p.ProductID
        ) AS Brand,
        (
        SELECT  AttributeValues
        FROM    ProductAttributeValues pv
        WHERE   pv.AttributeID = 2
                AND pv.ProductID = p.ProductID
        ) AS Category,
        (
        SELECT  AttributeValues
        FROM    ProductAttributeValues pv
        WHERE   pv.AttributeID = 3
                AND pv.ProductID = p.ProductID
        ) AS Artist
FROM    Products p
0 голосов
/ 17 апреля 2009

Попробуйте этот запрос, возможно, потребуется некоторая настройка

Select pm.ProductId, pm.PDescription, pav1.AttributeValues, pav2.AttributeValues, pav3.AttributeValues 
from Productmaster pm, ProductAttributeValues pav1, ProductAttributeValues pav2, ProductAttributeValues pav3 
where pm.ProductId = pav1.ProductId 
and pav1.AttributeID = 1 
and pm.ProductId = pav2.ProductId 
and pav2.AttributeID = 2 
and pm.ProductId = pav3.ProductId 
and pav3.AttributeID = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...