基于匹配值添加列的查询

aelbi1ox  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(213)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

两年前关门了。
改进这个问题
我有两张table:钥匙和订单
在key表中,我只有order id,但是我需要orders表中提供的更多细节,比如电子邮件、姓名。。等。
如何将具有匹配订单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
taor4pac

taor4pac1#

您需要枚举每个表中的值,以避免订单上出现笛卡尔积。在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\ n()over(partition by order\ n id order by order\ n id)作为orders o的seqnum)o(select k.*,row\ n()over(partition by order\ n id,order\ n id)作为key k的seqnum)k on o.order\ n id=k.order\ n id and o.seqnum=k.seqnum;

slsn1g29

slsn1g292#

可以通过创建表值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
7xllpg7q

7xllpg7q3#

一个简单的 join 应该做到:

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

如果没有钥匙也可以下单,你应该用 left join 而不是 join .

相关问题