簡體   English   中英

將INNER-JOIN與UNION ALL和mysql中的另一個表一起使用

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

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