[英]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.