Sql 使用另一个表中的列动态更新表
我有一个这样的顾客:Sql 使用另一个表中的列动态更新表,sql,salesforce,Sql,Salesforce,我有一个这样的顾客: CREATE TABLE tbl_customer ( id INTEGER, name VARCHAR(16), voucher VARCHAR(16) ); CREATE TABLE tbl_voucher ( id INTEGER, code VARCHAR(16) ); UPDATE tbl_customer SET voucher = ( SELECT code FROM tbl_voucher WHERE code
CREATE TABLE tbl_customer (
id INTEGER,
name VARCHAR(16),
voucher VARCHAR(16)
);
CREATE TABLE tbl_voucher (
id INTEGER,
code VARCHAR(16)
);
UPDATE tbl_customer
SET voucher = (
SELECT code
FROM tbl_voucher
WHERE code NOT IN (
SELECT voucher
FROM tbl_customer
WHERE voucher IS NOT NULL
)
LIMIT 1
)
WHERE voucher IS NULL;
和这样的凭证表:
CREATE TABLE tbl_customer (
id INTEGER,
name VARCHAR(16),
voucher VARCHAR(16)
);
CREATE TABLE tbl_voucher (
id INTEGER,
code VARCHAR(16)
);
UPDATE tbl_customer
SET voucher = (
SELECT code
FROM tbl_voucher
WHERE code NOT IN (
SELECT voucher
FROM tbl_customer
WHERE voucher IS NOT NULL
)
LIMIT 1
)
WHERE voucher IS NULL;
现在,假设customer表中始终有填充了id和名称的行,但是需要定期从tbl\u凭证
表中插入凭证
重要提示:每张凭证只能分配给一个特定客户(即必须是唯一的)
我写了这样一个查询:
CREATE TABLE tbl_customer (
id INTEGER,
name VARCHAR(16),
voucher VARCHAR(16)
);
CREATE TABLE tbl_voucher (
id INTEGER,
code VARCHAR(16)
);
UPDATE tbl_customer
SET voucher = (
SELECT code
FROM tbl_voucher
WHERE code NOT IN (
SELECT voucher
FROM tbl_customer
WHERE voucher IS NOT NULL
)
LIMIT 1
)
WHERE voucher IS NULL;
但是,这并不像预期的那样有效,因为查找未使用凭证的部分只执行一次,然后将所述凭证应用于每个客户
关于如何不用循环之类的编程结构来解决这个问题,有什么想法吗
还有一些示例数据,您可以想象我希望发生什么:
INSERT INTO tbl_customer VALUES (1, 'Sara', 'ABC');
INSERT INTO tbl_customer VALUES (1, 'Simon', 'DEF');
INSERT INTO tbl_customer VALUES (1, 'Andy', NULL);
INSERT INTO tbl_customer VALUES (1, 'Alice', NULL);
INSERT INTO tbl_voucher VALUES (1, 'ABC');
INSERT INTO tbl_voucher VALUES (2, 'LOL');
INSERT INTO tbl_voucher VALUES (3, 'ZZZ');
INSERT INTO tbl_voucher VALUES (4, 'BBB');
INSERT INTO tbl_voucher VALUES (5, 'CCC');
在执行了想要的查询之后,我希望Andy能得到凭证
LOL
,Alice
应该得到ZZZ
我猜这是MySQL。答案是这是一种痛苦。以下内容在选择中指定值:
select c.*, v.voucher
from (select c.*, (@rnc := @rnc + 1) as rn
from tbl_customer c cross join
(select @rnc := 0) params
where c.voucher is null
) c join
(select v.*, (@rnv := @rnv + 1) as rn
from tbl_vouchers v cross join
(select @rnv := 0) params
where not exists (select 1 from tbl_customers c where c.voucher = v.voucher)
) v
on c.rn = v.rn;
您现在可以将其用于更新
:
update tbl_customer c join
(select c.*, v.voucher
from (select c.*, (@rnc := @rnc + 1) as rn
from tbl_customer c cross join
(select @rnc := 0) params
where c.voucher is null
) c join
(select v.*, (@rnv := @rnv + 1) as rn
from tbl_vouchers v cross join
(select @rnv := 0) params
where not exists (select 1 from tbl_customers c where c.voucher = v.voucher)
) v
on c.rn = v.rn
) cv
on c.id = cv.id
set c.voucher = cv.voucher;
请用您的RDBMSI标记。我实际上不确定正在使用什么RDBMS,这就是为什么我问您,如果不使用诸如循环之类的编程结构,是否可以做到这一点。我可以告诉你的是,查询将作为“营销云”Nice one中“数据扩展”的一部分运行,这确实适用于mysql!我会检查这是否也适用于Salesforce。