Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用另一个表中的列动态更新表_Sql_Salesforce - Fatal编程技术网

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。