Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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_Postgresql - Fatal编程技术网

Sql 在两个表上使用联接更新查询

Sql 在两个表上使用联接更新查询,sql,postgresql,Sql,Postgresql,我有客户和地址表 查询: SELECT * FROM addresses a, customers b WHERE a.id = b.id 返回474条记录 对于这些记录,我想将customer表的id添加到address表的cid中 例如: 如果对于第一条记录,customer的id是9,address的id也是9,那么我想在address表的cid列中插入9 我试过: UPDATE addresses a, customers b SET a.cid = b.id

我有客户和地址表

查询:

SELECT *
FROM addresses a,
     customers b
WHERE a.id = b.id
返回474条记录

对于这些记录,我想将customer表的id添加到address表的cid中

例如: 如果对于第一条记录,customer的id是9,address的id也是9,那么我想在address表的cid列中插入9

我试过:

UPDATE addresses a,
       customers b
SET a.cid = b.id
WHERE a.id = b.id

但这似乎不起作用

这是Postgres更新连接格式:

UPDATE address 
SET cid = customers.id
FROM customers 
WHERE customers.id = address.id

以下是其他变体:

官方说法,SQL语言不支持UPDATE语句中的JOIN或FROM子句,除非它位于子查询中。因此,Hoyle ANSI方法类似于

Update addresses
Set cid = (
            Select c.id
            From customers As c
            where c.id = a.id
            )
Where Exists    (
                Select 1
                From customers As C1
                Where C1.id = addresses.id
                )
然而,许多DBMS(如Postgre)支持在UPDATE语句中使用FROM子句。在许多情况下,需要在FROM子句中包含更新表并将其别名,但我不确定Postgres:

Update addresses
Set cid = c.id
From addresses As a
    Join customers As c
        On c.id = a.id
试试这个

UPDATE employee 
set EMPLOYEE.MAIDEN_NAME = 
  (SELECT ADD1 
   FROM EMPS 
   WHERE EMP_CODE=EMPLOYEE.EMP_CODE);
WHERE EMPLOYEE.EMP_CODE >='00' 
AND EMPLOYEE.EMP_CODE <='ZZ';

在联接条件中使用表别名:

update addresses a
set cid = b.id 
from customers b 
where a.id = b.id

这与问题完全无关,它是无效的SQL,Postgres也不需要在FROM子句中包含更新表。事实上,声明目标表不能出现在from_列表中,除非您打算进行自联接。因此,在FROM子句中提及该表可能会导致错误的结果,除非您希望该表与其自身连接。注意:您可以在UPDATE子句中为更新表别名。警告-以这种格式执行更新将以地址表中的所有行为目标。@RyanWilliams-这两种格式都将更新所有有客户的行,是的。这就是请求。@ADTC-排除From子句的Update子句是必须编写Update语句的ISO标准方式。因此,Postgres允许这样做是有道理的。包含From子句不是ISO标准,但大多数数据库供应商(包括Postgres)都以某种方式支持它。从所选答案中可以看出,即使未使用自联接,也可以在update子句中包含目标表。@Thomas我想澄清的是,在from子句中再次包含更新表将导致Postgres中的自联接,而其他DB的行为可能不同。这是为了帮助不小心的开发人员避免在Postgres中进行非预期的连接,最有可能是表本身的可怕笛卡尔连接。这一点在Postgres文档中有明确的说明,并且问题被标记为Postgres。FTR,Postgres允许,并且事实上要求您从客户处写入更新地址,其中。。。如果不打算使用自联接。联接组合了一个或多个表中的列,则in只是一个ID列表,即使您是从另一个select获取它们的。这个答案与问题无关。客户和地址之间没有竞价。如果您将来自不同数据库的两个同名表连接起来,此方法可以避免出现问题
update addresses a
set cid = b.id 
from customers b 
where a.id = b.id