Join

加入兩個表以獲得單個組合結果集

  • November 27, 2018

tl;博士我在這裡http://sqlfiddle.com/#!9/031e71/1做了一個 SQLFiddle,帶有一個最小的、完整的、可重現的測試案例(儘管非常特定於訂單和產品的問題域)。

我在 MariaDB 上有一個 Zen Cart 電子商務系統,但在將訂單資訊提取到下游訂單管理系統的方式上存在問題。我還研究了訂單管理系統中的腳本以修改數據,但似乎他們的 API 不允許在那個階段修改訂單(啊!)所以我正在通過讀取訂單時使用的 SQL 進行嘗試從 MariaDB 到訂單管理系統。

該場景是優惠券已應用於訂單,從而產生折扣,我希望該優惠券的存在與訂單中的產品一起出現在結果集中。因此,如果您購買堅果 $ 100 and apply a $ 10 折扣券,我想要結果集中的兩行,一為 Nuts 在 $ 80 and one for the coupon at $ 10,所以總數等於 $ 90 (the $ 100 的成本減去 10 美元的折扣)。數學不是問題,問題是產品的存在和優惠券的存在在兩個非常不同的表中。

Zen Cart 有三個主要的表:

  • 訂單 - 每個訂單一條記錄
  • orders_totals - 每個訂單 4 或 5 條記錄,包括總計、小計、增值稅內容、折扣券(這是我的問題的癥結所在)
  • orders_products - 每個訂單中每個產品一個記錄。

我想針對orders_totals 和orders_products 加入訂單以獲得每個產品一行,如果orders_totals 中存在一行作為優惠券的訂單,則增加一行。

有沒有優雅的方法來解決這個問題?我不確定一個狡猾的 JOIN 是否足夠,或者是否可能需要一個 View 或 PARTITION。

** 編輯 ** 我做了一個新的小提琴,它採用優惠券金額,將其除以產品數量,然後從每個產品金額中減去該部分,並結合 UNION 建議。請參閱http://sqlfiddle.com/#!9/27ad50/3 .. 但這似乎很醜陋,因為 UNION 前半部分的連接中所有子選擇都在進行,我不敢說這是一個很好的解決方案!

在這種情況下,由於Coupon是另一個表的特定條目,我將使用 UNION。

作為建議,我會嘗試將 , 的“優惠券”條目轉換orders_total為作為另一行添加到orders表中的另一個產品。

SELECT orders_id, products_name as name, cost
FROM orders o 
JOIN  orders_products op on o.orders_id = op.fk_orders_id
WHERE o.orders_id = 1
UNION
SELECT fk_orders_id, name, total as cost
FROM   orders_totals
WHERE fk_orders_id = 1
AND   name = 'coupon'

結果

| orders_id |   name | cost |
|-----------|--------|------|
|         1 |   Nuts |  100 |
|         1 | coupon |  -10 |

sqlfiddle在這裡

引用自:https://dba.stackexchange.com/questions/223536