[英]SQL JOIN to Only One Row
我有2個銷售數據表,沒有公用密鑰,只有銷售日期和客戶名稱。 我想加入它們,以便表A中的每一行最多有表B中的1個匹配項,如果找不到則為0。 問題是同一客戶在同一日期出現兩次。 所以如果我有這些數據
Table A Table B
Customer | Date | Receipt Customer | Date | Invoice
=============================== ===============================
John | 2018-01-01 | A John | 2018-01-01 | C
John | 2018-01-01 | B John | 2018-01-01 | D
我怎么得到這個
Result
Customer | Date | Receipt | Invoice
=========================================
John | 2018-01-01 | A | C
John | 2018-01-01 | B | D
只要收據A匹配一次,收據A與發票C或D是否匹配都沒有關系。 目前,我的查詢加入了AC,AD,BC,BD
編輯:澄清一下,我不能從任何一個表重復。 一張發票和收據只能出現一次。 因此,這些結果之一是可以接受的:
這很痛苦,因為您需要枚舉兩個表,然后進行join
或聚合。 這是一種方法:
select customer, date, max(receipt) as receipt, max(invoice) as invoice
from ((select a.customer, a.date, a.receipt,
(@rnr := if(@cd = concat_ws(';', customer, date), @rnr + 1,
if(@cd := concat_ws(';', customer, date), 1, 1)
)
) as seqnum
from a cross join
(select @rnr := 0, @cd := '') params
order by a.customer, a.date
) union all
(select b.customer, b.date, b.invoice,
(@rni := if(@cd = concat_ws(';', customer, date), @rni + 1,
if(@cd := concat_ws(';', customer, date), 1, 1)
)
) as seqnum
from b cross join
(select @rni := 0, @cd := '') params
order by a.customer, a.date
)
) cd
group by customer, date, seqnum;
由於只希望使用不同的記錄,為什么在加入兩個表之后不只是進行不同的記錄呢?
SELECT DISTINCT a.Customer,
a.Date,
a.Receipt,
b.Invoice
FROM Table_A a
JOIN Table_B b
ON a.Customer = b.Customer
AND a.Date = b.Date
我將給出一個您可能不會喜歡的答案:這不應該在SQL中完成。 這是一個演示/顯示問題。
在向用戶顯示數據而不是SQL后端的層中執行此類工作。 他們在網頁上查找嗎? 然后讓網頁獲取原始數據並根據需要對其進行格式化-將每天的收據或每天的發票的內容放在單獨的div中。 SQL是否使用此數據發送電子郵件? 然后,不要讓它生成純文本電子郵件-讓它生成HTML並將數據放入表格單元格中(這樣,您就不必在數據量可能不同的兩組數據之間協調行)。
您確實不想玩試圖使SQL輸出在SQL內部看起來很漂亮的游戲。 因為,說實話,你已經接受答案的代碼可以正常工作 ,但我討厭試圖維護它多年來...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.