2015-11-03 30 views
5

Çok boyutlu ifadenin sonucunu filtrelemeyi anlamak için çok zor zamanlarım var.Çoktan çoğa tabloya göre filtreleme

Bu benim veritabanı şema.

A simple database schema

Ve bu benim veridir.

Manufacturer 
╔════╦═══════════════════╗ 
║ Id ║  Name  ║ 
╠════╬═══════════════════╣ 
║ 1 ║ Awesome Computers ║ 
║ 2 ║ TailSpin Toys  ║ 
╚════╩═══════════════════╝ 

Item 
╔════╦═════════╦════════════════╦═══════╗ 
║ Id ║ Name ║ ManufacturerId ║ Stock ║ 
╠════╬═════════╬════════════════╬═══════╣ 
║ 1 ║ PC  ║    1 ║ 40 ║ 
║ 2 ║ Server ║    1 ║ 10 ║ 
║ 3 ║ STB  ║    2 ║ 80 ║ 
║ 4 ║ Console ║    2 ║ 50 ║ 
╚════╩═════════╩════════════════╩═══════╝ 

Part 
╔════╦══════════════════╦════════╦══════════╦═══════╗ 
║ Id ║  Name  ║ ItemId ║ StatusId ║ Stock ║ 
╠════╬══════════════════╬════════╬══════════╬═══════╣ 
║ 1 ║ MBO    ║  1 ║  1 ║ 100 ║ 
║ 2 ║ Processor  ║  1 ║  1 ║ 100 ║ 
║ 3 ║ Server MBO  ║  2 ║  2 ║ 20 ║ 
║ 4 ║ Server processor ║  2 ║  2 ║ 20 ║ 
║ 5 ║ Main box   ║  3 ║  2 ║ 40 ║ 
║ 7 ║ Adapter   ║  3 ║  3 ║ 30 ║ 
║ 8 ║ Controller  ║  4 ║  2 ║ 40 ║ 
║ 10 ║ Adapter   ║  4 ║  1 ║ 60 ║ 
║ 11 ║ Memory card  ║  4 ║  2 ║ 80 ║ 
╚════╩══════════════════╩════════╩══════════╩═══════╝ 

Status 
╔════╦═════════════╗ 
║ Id ║ Name  ║ 
╠════╬═════════════╣ 
║ 1 ║ No data  ║ 
║ 2 ║ Available ║ 
║ 3 ║ Unavailable ║ 
╚════╩═════════════╝ 

Her şeyi tablo model çözümüne aktardım.

  • Tablo Ürün: ItemStock: = TOPLAM ([Hazır])
  • Tablo Bölüm: PartStock: = TOPLAM ([Hazır])
Bundan sonra, iki önlem oluşturulan

Daha sonra küpü sunucuya dağıttım. Aşağıdaki MDX sorgusu çalıştırarak

...

SELECT 
    NON EMPTY { 
     [Part].[Name].CHILDREN 
    } ON ROWS, 
    { 
     [Measures].[PartStock] 
    } ON COLUMNS 
FROM [Model] 
WHERE (
    { 
     [Status].[Id].&[1] 
    } 
) 

... Ben Tamam olduğu ... ...

╔═══════════╦═══════════╗ 
║   ║ PartStock ║ 
╠═══════════╬═══════════╣ 
║ Adapter ║  60 ║ 
║ MBO  ║  100 ║ 
║ Processor ║  100 ║ 
╚═══════════╩═══════════╝ 

bu resultset olsun. Ancak

bu MDX sorgusu çalıştırırken, ...

SELECT 
    NON EMPTY { 
     [Item].[Name].CHILDREN 
    } ON ROWS, 
    { 
     [Measures].[ItemStock] 
    } ON COLUMNS 
FROM [Model] 
WHERE (
    { 
     [Status].[Id].&[1] 
    } 
) 

... Bu resultset alıyorum ... Ben bekliyordum
╔═════════╦═══════════╗ 
║   ║ ItemStock ║ 
╠═════════╬═══════════╣ 
║ Console ║  50 ║ 
║ PC  ║  40 ║ 
║ Server ║  10 ║ 
║ STB  ║  80 ║ 
╚═════════╩═══════════╝ 

o ItemStock tabloda bulunan öğeler olur Tabloya çoktan çoğa bir ilişki olarak Part tablosundan süzülür. Örneğin. Sonuç kendilerine kısıtlı olacaktır böylece MBO, İşlemci ve Adaptör, madde 1 ve 4'e referanslara sahip ve sonuçta aşağıdaki gibi çıkmak gerekir: Neyi yanlış yapıyorum

╔═════════╦═══════════╗ 
║   ║ ItemStock ║ 
╠═════════╬═══════════╣ 
║ Console ║  50 ║ 
║ PC  ║  40 ║ 
╚═════════╩═══════════╝ 

?

+1

DBA'ya gönderdiğiniz soruya cevap verdi: http://dba.stackexchange.com/questions/119909/filtering-by-many-to-many-table – GregGalloway

cevap

0

MDX, benim için bilinmiyor ama burada saf bir SQL açıklaması var.

Modeliniz böyle aslında:

SELECT Item.Name 
FROM Item INNER JOIN Part ON Item.Id = Part.ItemID 
WHERE Part.StatusID = 1; 

I:

Link to image

ben bu saf SQL kullanmak olur özgül [Durum] ile [Parçaların] için [Öğeler] almak için örneğinizde FROM [Model] kullandığınızı görebilir, ancak kurulumunuzda Model adında bir tablonuz yoktur - bu, bakmanız gereken bir VIEW veya MDX için bazı işlevler olabilir. Tablolar arasındaki JOIN [Model] görünümü için yanlış olabilir.

İlgili konular