[英]Using INNER-JOIN with UNION ALL and another table in mysql
[提出問題的新手]我正在嘗試使用SUBSTRING_INDEX和UNION ALL以常見的分隔符“”分割多個字段,這些我已經從其他堆棧溢出答案中成功完成。
在另一個示例中,我還設法INNER-JOIN另一個表(product_info)
問題是將兩者結合在一起時。 我對UNIONS(或與此有關的INNER JOIN)不熟悉。 因此要達到預期的效果一直很困難。
有些字段包含不止一項,據我了解這本身就是管理不善。 在NITM包含商品的地方,其他字段包含每個相應商品的數量和價格,並用空格分隔。
表“ salesimport”中的代碼示例:
ID | NITM | NQTY | SALE_PRICE |
1 | CAP LIGHT CHAIR | 1 1 2 | 2.99 4.99 44.99 |
2 | LIGHT | 2 | 4.99 |
3 | CHAIR | 4 | 44.99 |
表“ product_info”中的代碼示例:
ID | PROD_ID | UNIT_COST | SUPPLIER |
25 | CAP | 1.00 | X&Y |
87 | LIGHT | 1.23 | X&Y |
79 | CHAIR | 9.00 | JONES_CO |
只需將第一個吐出方法與SUBSTRING_INDEX和UNION ALL一起使用,訂單中的每個項目都會輸入到新行中,例如ID 1、1、1、2、3等。
但是當我嘗試添加以下內容時:
INNER JOIN product_info
ON salesimport.NITM = product_info.PROD_ID
訂單行再次被復制,類似於下面的示例,其中每個項目都獲得每個排列。
ID | ITEM | QTY | PRICE | UNIT_COST | SUPPLIER |
1 | CAP | 1 | 2.99 | 1.00 | X&Y |
1 | CAP | 1 | 2.99 | 1.23 | JONES_CO |
1 | LIGHT | 1 | 4.99 | 1.00 | X&Y |
1 | LIGHT | 1 | 4.99 | 1.23 | JONES_CO |
這是我的工作代碼:
SELECT *,
Substring_index(Substring_index(nitm, ' ', n.digit + 1), ' ', -1)
AS ITEM,
Substring_index(Substring_index(nqty, ' ', n.digit + 1), ' ', -1)
AS QTY,
Substring_index(Substring_index(sale_price, ' ', n.digit + 1), ' ', -1)
AS PRICE,
Format(Substring_index(Substring_index(nqty, ' ', n.digit + 1), ' ', -1)
*
Substring_index(Substring_index(sale_price, ' ', n.digit + 1), ' '
, -1),
2)
AS SUBTOTAL,
FROM salesimport
INNER JOIN (SELECT 0 digit
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4) AS n
ON Length(Replace(nitm, ' ', '')) <= Length(nitm) - n.digit
上面的代碼示例:
ID | ITEM | QTY | PRICE |
1 | CAP | 1 | 2.99 |
1 | LIGHT | 1 | 4.99 |
1 | CHAIR | 2 | 44.99 |
2 | LIGHT | 2 | 4.99 |
3 | CHAIR | 4 | 44.99 |
這就是我希望最終輸出看起來的樣子:
ID | ITEM | QTY | PRICE | UNIT_COST | SUPPLIER |
1 | CAP | 1 | 2.99 | 1.00 | X&Y |
1 | LIGHT | 1 | 4.99 | 1.23 | X&Y |
1 | CHAIR | 2 | 44.99 | 9.00 | JONES_CO |
2 | LIGHT | 2 | 4.99 | 1.23 | X&Y |
3 | CHAIR | 4 | 44.99 | 9.00 | JONES_CO |
預先對任何錯誤表示抱歉
如果時間允許,我寧願標准化數據,而不要利用效率低下的字符串操作。 閱讀: 在數據庫列中存儲定界列表真的那么糟糕嗎?
無論如何,您可以使用派生表在此處進行JOIN
:
SELECT *
FROM product_info AS pi
JOIN (SELECT *,
Substring_index(Substring_index(nitm, ' ', n.digit + 1), ' '
, -1)
AS ITEM,
Substring_index(Substring_index(nqty, ' ', n.digit + 1), ' '
, -1)
AS QTY,
Substring_index(Substring_index(sale_price, ' ', n.digit + 1
), ' ',
-1)
AS PRICE,
Format(Substring_index(Substring_index(nqty, ' ',
n.digit + 1), ' '
, -1)
*
Substring_index(Substring_index(sale_price, ' ',
n.digit + 1
),
' ', -1),
2)
AS SUBTOTAL,
FROM salesimport
INNER JOIN (SELECT 0 digit
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4) AS n
ON Length(Replace(nitm, ' ', '')) <=
Length(nitm) - n.digit
) AS dt
ON dt.nitm = pi.prod_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.