में एक-दूसरे के बगल में एक ही टेबल से डेटा मेरे पास चार टेबल हैं: दस्तावेज़, आइटम, आलेख और दस्तावेज़रचनाएं। दस्तावेज़ों में तीन प्रकार के दस्तावेज़ होते हैं, यह प्रश्न केवल उनमें से दो से संबंधित है: आदेश और चालान। चालान आदेशों के आधार पर उत्पन्न होता है। चालान में कई ऑर्डर हो सकते हैं और एक ऑर्डर में कई चालान हो सकते हैं। आदेश और चालान में कई आइटम हो सकते हैं। तालिका दस्तावेजकरण में ऑर्डर और चालान के बीच संबंध होते हैं, जो चालान किस ऑर्डर/ऑर्डर से उत्पन्न होता था।एसक्यूएल पंक्तियों को गुणा करना। चुनिंदा
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
इस सवाल की तरह दिखना चाहिए कैसे है। त्वरित और सटीक उत्तर प्राप्त करने के लिए http://rextester.com स्कीमा और डेटा जोड़ने पर विचार करें। – lad2025
इसे तैयार करने में मुझे कुछ समय लगेगा। सलाह के लिए धन्यवाद। – Sonia
पहली क्वेरी "सब कुछ गुणक" कैसे करती है? यह मेरे लिए सही लग रहा है। कृपया अपने नमूने डेटा के साथ अपनी पहली क्वेरी से प्राप्त होने वाले परिणाम पोस्ट करें ताकि हम देख सकें कि इसमें क्या गलत है। दूसरी क्वेरी निश्चित रूप से गलत है। –