簡體   English   中英

SQL乘以行。 選擇中彼此相鄰的同一個表中的數據

[英]SQL multiplying rows. Data from the same table next to each other in select

我有四個表:文檔,項目,文章和文檔關系。 在文檔中有三種類型的文檔,這個問題只涉及其中兩種:訂單和發票。 發票根據訂單生成。 發票可以有多個訂單,一個訂單可以有多個發票。 訂單和發票可以有多個項目。 表DocumentRelations包含訂單和發票之間的關系,哪個發票是從哪個訂單/訂單生成的。

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不包含與發票/ s相同的每個項目的數量。 發票的相應訂單/ s不包含與訂單/ s相同的每個項目的數量。

這里我的問題開始了:我需要以易於比較的形式獲得每個文檔中包含數量的項目列表。 因此,訂單的ID,發票的ID,項目的名稱,訂單中的數量,發票中的數量。

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

我喜歡第二個 - 你需要只為你的條件添加ArticleID,除了缺少一些字符串的Names之外,你幾乎可以得到你想要的東西。 我們假設您在一個文檔中沒有相同文章的兩行或更多行:

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM