2015-11-03 9 views
5

मुझे समझने में कठिनाई होती है कि बहुआयामी अभिव्यक्ति के परिणाम को कैसे फ़िल्टर किया जाए।कई से कई टेबल फ़िल्टरिंग

यह मेरा डेटाबेस स्कीमा है।

A simple database schema

और यह अपने डेटा है।

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 ║ 
╚════╩═════════════╝ 

मैंने सबकुछ टैब्यूलर मॉडल समाधान में आयात किया।

  • टेबल मद:: ItemStock: = SUM ([स्टॉक])
  • तालिका भाग: PartStock: = SUM ([स्टॉक])
इस के बाद, मैं दो उपायों बनाया

फिर मैंने सर्वर पर घन तैनात किया।

निम्नलिखित MDX क्वेरी चलाकर ...

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

... मैं इस resultset मिलता है ...

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

... जो ठीक है।

हालांकि, जब इस MDX क्वेरी चल रहा है ...

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

... मैं इस resultset हो रही है ...

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

मैं उम्मीद कर रहा था कि ItemStock तालिका के आइटम होगा भाग तालिका से कई से अधिक रिश्तों के रूप में फ़िल्टर किया जाना चाहिए। जैसे MBO, प्रोसेसर और एडाप्टर, 1 आइटम और 4 के लिए संदर्भ है, तो परिणाम उन्हें करने के लिए विवश किया जाएगा, और परिणाम इस तरह बाहर कर देना चाहिए:

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

क्या मैं गलत कर रहा हूँ?

+1

आपके द्वारा डीबीए पर पोस्ट किए गए प्रश्न पर उत्तर दिया गया: http://dba.stackexchange.com/questions/119909/filtering-by-many-to-many-table – GregGalloway

उत्तर

0

एमडीएक्स मेरे लिए अज्ञात है लेकिन यहां एक शुद्ध एसक्यूएल स्पष्टीकरण है।

आपका मॉडल वास्तव में इस तरह है:

Link to image

साथ spesific [स्थिति] के लिए [पार्ट्स] [आइटम] प्राप्त करने के लिए मैं इस शुद्ध एसक्यूएल उपयोग करने के लिए होगा:

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

मैं आपके नमूने में देख सकते हैं कि आप [मॉडल] से उपयोग करते हैं, लेकिन आपके सेटअप में मॉडल नामक कोई टेबल नहीं है - इसलिए यह एमडीएक्स के लिए एक दृश्य या कुछ कार्यक्षमता हो सकती है, आपको देखना चाहिए। यह हो सकता है कि टेबल के बीच जॉइन [मॉडल] दृश्य के लिए गलत है।

संबंधित मुद्दे