2009-04-17 8 views
0

Ich habe 3 Tabellen:SQL Bericht von Entity-Attribut-Wert-strukturierte Daten zu generieren

Productmaster:

ProductId PName  PDescription 

Attribute:

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

ProductAttributeValues ​​

paId ProductId AttributeID AttributeValues 

A product kann mehrere attributes haben.

Hier ist die gewünschte Ausgabe:

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

Wie kann ich diese Ausgabe erhalten?

Vielen Dank im Voraus.

+2

Was RDBMS? Was wird erwartet? Welche SQL laufen Sie? – gbn

+1

Was konnten Sie durch Ihre Versuche erreichen? Können Sie Ihre "fast-da" -Abfrage posten? Ich werde versuchen, Ihnen zu helfen, die Fehler zu beseitigen. – Gishu

Antwort

0

Diese Abfrage, vielleicht einige zwicken erforderlich

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 
+0

bevorzugen joins [auch tat code sauber) –

+0

Danke Ian, können Sie mir bitte sagen, wie man das Scrollen fram für den Code zu bekommen. Gibt es einen Link auf der Website, der über diese und andere nützliche Hinweise spricht? –

+0

Danke, dass ich das getan habe –

1

Sie links für jeden Attributwert beitreten sollten Sie in ziehen wollen, zum Beispiel

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) 

Um diese wieder in Englisch zu drehen, „Gib mir alle Produkte, und für jeden, geben Sie mir eine Marke, Kategorie und Künstler Attribut, wenn es sie gibt“, dass ein Produkt

Ich habe angenommen hat nur ein oder null Werte für jedes Attribut.

1

wird angenommen, dass jedes Attribut pro Produkt genau einmal vorkommt:

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' 

Sie links Outer-Joins verwenden können, wenn die Daten nicht immer verfügbar ist.

0
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 
Verwandte Themen