我有四個表:文檔,項目,文章和DocumentRelations。在文件中有三種類型的文件,這個問題只涉及其中的兩個:訂單和發票。發票是根據訂單生成的。發票可以有多個訂單,一個訂單可以有多個發票。訂單和發票可以有多個項目。表DocumentRelations包含訂單和發票之間的關係,該發票是從哪個訂單/訂單生成的。SQL乘以行。來自同一張表中相鄰數據的選擇
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:相應的命令/ s到發票/ s不存在。對應的發票/訂單/ s不存在。
情景2:對應的發票/訂單/ s不包含與發票相同數量的每件物品。相應的發票訂單不包含與訂單相同數量的每件商品。
這裏我的問題開始於: 我需要以容易比較的形式獲取每個文檔中包含數量的項目列表。因此,訂單編號,發票編號,項目名稱,訂單數量,發票數量。
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包含三種類型的文檔,因此不應出現帶有第三種文檔的文檔。
我的第一個計劃是讓兩個選擇返回列,我只需要,每個文檔類型。然後根據DocumentRelations中的ID將它們加入。但是,這一切都是倍數。估計結果大約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。創建兩個選擇,一個具有訂單ID,項目名稱,項目數量和相應發票的ID。其次是發票相同。根據具有相應文檔ID的列進行完全外連接來加入它們,但結果相同。
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
第一個查詢「Multiples everything」?它看起來對我是正確的。請將您從第一次查詢中獲得的結果與樣本數據一起發佈,以便我們可以看到它的錯誤。第二個查詢是絕對錯誤的。 –