Mysql 基于匹配值添加列的查询

Mysql 基于匹配值添加列的查询,mysql,sql,select,Mysql,Sql,Select,我有两张桌子:钥匙和订单 在密钥表中,我只有订单id,但我需要订单表中提供的更多详细信息,如电子邮件、姓名。。等等 如何将具有匹配订单id的键附加到另一个表中 键表 Key Order ID ----- -------- 1234 0001 1235 0001 1532 0002 1602 0003 1802 0004 订单表 Email Orde

我有两张桌子:钥匙和订单

在密钥表中,我只有订单id,但我需要订单表中提供的更多详细信息,如电子邮件、姓名。。等等

如何将具有匹配订单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
一个简单的连接应该可以做到这一点:

SELECT `email`, o.`order_id`, `key`
FROM   `orders` o
JOIN   `keys k ON o.`order_id` = k.`order_id`

如果可以使用不带键的订单,则应使用左联接而不是联接。

您需要枚举每个表中的值,以避免订单上出现笛卡尔积。在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中,按顺序分区的行号按顺序id按顺序id按顺序id作为seqnum 从命令 o 选择k.*,按订单id划分的行号,按订单id划分的订单号作为seqnum 来自k键 K
o.order_id=k.order_id,o.seqnum=k.seqnum

您可以通过创建表值SQL函数并在查询中使用来实现这一点

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

阅读关于加入的内容。这将为电子邮件生成四行email1@example.com.