我有两张桌子:钥匙和订单
在密钥表中,我只有订单ID ,但我需要订单表中提供的更多详细信息,例如< em>电子邮件,姓名等等。
如何将具有匹配订单ID 的密钥附加到另一个表?
按键表
Key Order ID
----- --------
1234 0001
1235 0001
1532 0002
1602 0003
1802 0004
订单表
Email Order ID
----- --------
email1@example.com 0001
email1@example.com 0001
email2@example.com 0002
email3@example.com 0003
email4@example.com 0004
必填结果:
Email Order ID Key
----- -------- -------
email1@example.com 0001 1234
email1@example.com 0001 1235
email2@example.com 0002 1532
email3@example.com 0003 1602
email4@example.com 0004 1802
答案 0 :(得分:1)
一个简单的join
应该可以解决问题:
SELECT `email`, o.`order_id`, `key`
FROM `orders` o
JOIN `keys k ON o.`order_id` = k.`order_id`
如果订单没有密钥,您应该使用left join
代替join
。
答案 1 :(得分:0)
您需要枚举每个表中的值,以避免订单上的笛卡尔积。在MySQL v8中,您可以使用row_number()
。这个答案显示了在早期版本中要做什么。
select o.*, k.key
from (select o.*,
(@rno := if(@o = order_id, @rno + 1,
if(@o := order_id, 1, 1)
)
) as seqnum
from (select o.*
from orders o
order by order_id
) o cross join
(select @o := -1, @rno := 0) params
) o join
(select k.*,
(@rn, := if(@o = order_id, @rn, + 1,
if(@o := order_id, 1, 1)
)
) as seqnum
from (select k.*
from keys k
order by order_id
) k cross join
(select @o := -1, @rnk := 0) params
) k
on o.order_id = k.order_id and o.seqnum = k.seqnum;
相比之下,MySQL 8+或几乎任何其他数据库中的代码如下所示:
选择o。,k .key from(select o。,row_number()over(order by order_id order by order_id)as seqnum 来自订单o )o (选择k。*,row_number()over(按order_id分区,order by order_id)作为seqnum 来自钥匙k )k on o.order_id = k.order_id and o.seqnum = k.seqnum;
答案 2 :(得分:0)
您可以通过创建一个值为SQL Function的表并在查询中使用来实现此目的。
CREATE FUNCTION TEST (@key varchar(20))
RETURNS @Order TABLE -- Table definition for result
(
Email varchar(100),
Name varchar(100)
)
AS
BEGIN
INSERT INTO @Order
SELECT TOP 1 EMAIL,Name FROM Order WHERE OrderId = @key
RETURN
END
然后在您的Select查询中检索如下结果:
SELECT *,(SELECT Email From Dbo.Test(K.OrderId)) FROM KEYS K