2017-08-24 50 views
5

我有四個表:文檔,項目,文章和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 
+3

這是問題應該怎麼樣子。考慮添加http://rextester.com模式和數據以獲得快速和準確的答案。 – lad2025

+1

準備工作需要一段時間。謝謝你的建議。 – Sonia

+0

第一個查詢「Multiples everything」?它看起來對我是正確的。請將您從第一次查詢中獲得的結果與樣本數據一起發佈,以便我們可以看到它的錯誤。第二個查詢是絕對錯誤的。 –

回答

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

我在第二個查詢的最後一行發生了錯誤,應該是O而不是D.不管怎樣,'AND O.ArticleID = I.ArticleID'可能解決了它。它給出了與估計結果最接近的結果。我會做幾個測試來確認它。 – Sonia

相關問題