2017-08-24 56 views
5

में एक-दूसरे के बगल में एक ही टेबल से डेटा मेरे पास चार टेबल हैं: दस्तावेज़, आइटम, आलेख और दस्तावेज़रचनाएं। दस्तावेज़ों में तीन प्रकार के दस्तावेज़ होते हैं, यह प्रश्न केवल उनमें से दो से संबंधित है: आदेश और चालान। चालान आदेशों के आधार पर उत्पन्न होता है। चालान में कई ऑर्डर हो सकते हैं और एक ऑर्डर में कई चालान हो सकते हैं। आदेश और चालान में कई आइटम हो सकते हैं। तालिका दस्तावेजकरण में ऑर्डर और चालान के बीच संबंध होते हैं, जो चालान किस ऑर्डर/ऑर्डर से उत्पन्न होता था।एसक्यूएल पंक्तियों को गुणा करना। चुनिंदा

Documents: 
ID | Name 
-- | -------- 
1 | O/2017/1 
2 | I/2017/1 
3 | O/2017/2 
4 | I/2017/2 
5 | O/2017/3 
6 | O/2017/4 
.. | ... 
99 | X/2017/1 

Ttems: 
ID | ArticleID | DocumentID | Quantity 
-- | --------- | ---------- | -------- 
1 | 1   | 1   | 12 
2 | 1   | 2   | 3 
3 | 2   | 3   | 41 
4 | 2   | 4   | 41 
5 | 1   | 4   | 59 
6 | 1   | 5   | 59 
7 | 3   | 6   | 7 

Articles: 
ID | Name 
-- | ---- 
1 | A 
2 | B 
3 | c 

DocumentRelations: 
OrderID | InvoiceID 
------- | --------- 
1  | 2 
3  | 4 
5  | 4 
8  | 9 
8  | 10 
8  | 11 

परिदृश्य 1: संबद्ध क्रम/एस/चालान रों मौजूद नहीं है। ऑर्डर करने के लिए अनुरूप चालान/एस मौजूद नहीं है।

परिदृश्य 2: ऑर्डर करने के लिए अनुरूप चालान/एस में प्रत्येक आइटम की चालान/चालक के समान मात्रा नहीं होती है। चालान/एस के अनुरूप संवाद/क्रम में प्रत्येक आइटम की समान मात्रा में ऑर्डर नहीं होता है।

यहाँ मेरी समस्या शुरू होता है: मैं प्रत्येक दस्तावेज़ में मात्रा के साथ आइटम की सूची प्राप्त करने को आसानी से तुलनीय रूप में की जरूरत है। तो, आदेश की आईडी, चालान की आईडी, आइटम का नाम, क्रम में मात्रा, चालान में मात्रा।

OrderID | InvoiceID | ItemNameInOrder | QuantityInOrder | QuantityInInvoice 
------- | --------- | --------------- | --------------- | ----------------- 
1  | 2   | A    | 12    | 3 
3  | 4   | B    | 41    | 41 
5  | 4   | A    | 59    | 59 
6  | NULL  | C    | 7    | NULL 
NULL | 7   | B    | NULL   | 11 
8  | 9   | A    | 10    | 9 
8  | 10  | A    | 10    | 9 
8  | 11  | A    | 10    | 19 

यदि विशिष्ट चालान के लिए आदेश मौजूद नहीं है, तो कॉलम में नाम और मात्रा के साथ छोड़ दिया गया है। तालिका दस्तावेज़ में तीन प्रकार के दस्तावेज़ होते हैं, इसलिए तीसरे वाले दस्तावेज़ प्रकट नहीं होना चाहिए।

मेरी पहली योजना दो चयनों को कॉलम लौटने के लिए थी, जिन्हें मुझे केवल दस्तावेज़ की आवश्यकता के लिए ही चाहिए। फिर DocumentRelations में आईडी के आधार पर उनसे जुड़ें। लेकिन वह सब कुछ गुणक। अनुमानित परिणाम से लगभग 3 गुना अधिक।

SELECT O.ID, I.ID, O.ArticleName, O.Quantity, I.Quantity 
    FROM DocumentRelations R 
LEFT JOIN (SELECT D.ID, D.NumberString, I.Quantity, A.Name 
      FROM Documents D 
      JOIN Items I 
       ON D.ID = I.DocumentID 
      JOIN Articles A 
       ON I.ArticleID = A.ID 
      WHERE D.Name LIKE 'O/%') O 
     ON R.OrderID = O.ID 
LEFT JOIN (SELECT D.ID, , I.Quantity, A.Name 
      FROM Documents D 
      JOIN Items I 
       ON D.ID = I.DocumentID 
      JOIN Articles A 
       ON I.ArticleID = A.ID 
      WHERE D.Name LIKE 'I/%') I 
     ON R.InvoiceID = I.ID 

दूसरा पहले के समान है लेकिन अंत में DocumentRelations का उपयोग किए बिना। ऑर्डर आईडी, आइटम नाम, आइटम मात्रा और संबंधित चालान की आईडी के साथ दो चयन बनाएं। दूसरा वही है लेकिन चालान के लिए। इसी दस्तावेज़ के आईडी के साथ कॉलम के आधार पर पूर्ण बाहरी सम्मिलन के साथ उनसे जुड़ें, लेकिन परिणाम वही है।

SELECT O.ID, I.ID, O.ArticleName, O.Quantity, I.Quantity 
    FROM (SELECT D.ID, D.NumberString, I.Quantity, A.Name, R.InvoiceID 
      FROM Documents D 
      JOIN Items I 
      ON D.ID = I.DocumentID 
      JOIN Articles A 
      ON I.ArticleID = A.ID 
    LEFT JOIN DocumentRelations R 
      ON D.ID = R.OrderID 
     WHERE D.Name LIKE 'O/%') O 
FULL OUTER JOIN (
     SELECT D.ID, D.NumberString, I.Quantity, A.Name 
      FROM Documents D 
      JOIN Items I 
      ON D.ID = I.DocumentID 
      JOIN Articles A 
      ON I.ArticleID = A.ID 
     WHERE D.Name LIKE 'I/%') I 
    ON O.InvoiceID = I.ID 
+3

इस सवाल की तरह दिखना चाहिए कैसे है। त्वरित और सटीक उत्तर प्राप्त करने के लिए http://rextester.com स्कीमा और डेटा जोड़ने पर विचार करें। – lad2025

+1

इसे तैयार करने में मुझे कुछ समय लगेगा। सलाह के लिए धन्यवाद। – Sonia

+0

पहली क्वेरी "सब कुछ गुणक" कैसे करती है? यह मेरे लिए सही लग रहा है। कृपया अपने नमूने डेटा के साथ अपनी पहली क्वेरी से प्राप्त होने वाले परिणाम पोस्ट करें ताकि हम देख सकें कि इसमें क्या गलत है। दूसरी क्वेरी निश्चित रूप से गलत है। –

उत्तर

1

मैं एक दूसरे की तरह है - तुम सिर्फ अपनी शर्तों को ArticleID जोड़ने की जरूरत है और आप कुछ स्ट्रिंग्स के लिए नाम याद आ रही के अलावा लगभग आप चाहते हैं मिल जाएगा। और हम अनुमान है कि आप एक दस्तावेज़ में एक ही लेख के लिए दो या अधिक लाइनों की जरूरत नहीं है:

SELECT O.ID, I.ID, O.ArticleName, O.Quantity, I.Quantity 
    FROM (SELECT D.ID, D.NumberString, I.Quantity, A.Name, R.InvoiceID, D.ArticleID 
      FROM Documents D 
      JOIN Items I 
      ON D.ID = I.DocumentID 
      JOIN Articles A 
      ON I.ArticleID = A.ID 
    LEFT JOIN DocumentRelations R 
      ON D.ID = R.OrderID 
     WHERE D.Name LIKE 'O/%') O 
FULL OUTER JOIN (
     SELECT D.ID, D.NumberString, I.Quantity, A.Name, D.ArticleID 
      FROM Documents D 
      JOIN Items I 
      ON D.ID = I.DocumentID 
      JOIN Articles A 
      ON I.ArticleID = A.ID 
     WHERE D.Name LIKE 'I/%') I 
      ON D.InvoiceID = I.ID 
      AND D.ArticleID = I.ArticleID 
+0

मैंने दूसरी क्वेरी की आखिरी पंक्ति में गलती की, जो कि डी के बजाए ओ होना चाहिए। वैसे भी, 'और ओ। आर्टिकल आईडी = I.ArticleID' शायद इसे हल किया जाए।यह अनुमानित लोगों को निकटतम परिणाम देता है। मैं इसकी पुष्टि करने के लिए कुछ परीक्षण करूँगा। – Sonia

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