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