WITH novos_valores (cd_cidade, nm_cidade, uf) AS (values (12000, 'FAKE CITY', 'RS')),
upsert AS ( UPDATE cidade cid
SET nm_cidade = nv.nm_cidade, uf = nv.uf
FROM novos_valores nv
WHERE cid.cd_cidade = nv.cd_cidade RETURNING * )
INSERT INTO cidade (cd_cidade, nm_cidade, uf)
SELECT cd_cidade, nm_cidade, uf
FROM novos_valores
WHERE NOT EXISTS (SELECT 1 FROM upsert WHERE upsert.cd_cidade = novos_valores.cd_cidade)
上面的查询返回下面的错误,但我只是看不到它在哪里,有人可以帮助我吗?
SQL错误:
错误:列引用“cd_cidade”含糊不清LINE 11:...
哪里没有EXISTS(SELECT 1 FROM upsert WHERE upsert.cd _... ^
在街区:
WITH novos_valores (cd_cidade, nm_cidade, uf) AS (values (12000, 'FAKE CITY', 'RS')),
upsert AS ( UPDATE cidade cid
SET nm_cidade = nv.nm_cidade, uf = nv.uf
FROM novos_valores nv
WHERE cid.cd_cidade = nv.cd_cidade RETURNING * )
INSERT INTO cidade (cd_cidade, nm_cidade, uf)
SELECT cd_cidade, nm_cidade, uf
FROM novos_valores
WHERE NOT EXISTS (SELECT 1 FROM upsert WHERE upsert.cd_cidade = novos_valores.cd_cidade)
Execution time: 3.045 ms
答案 0 :(得分:0)
错误的根源在于:
UPDATE cidade cid
SET nm_cidade = nv.nm_cidade, uf = nv.uf
FROM novos_valores nv
WHERE cid.cd_cidade = nv.cd_cidade RETURNING *
RETURNING *返回cidade
和novos_valores
表中的所有值
由于两者都有cd_cidade
列,因此结果中有两列具有相同名称,并且此列不明确。
你可以在这个SQLFiddle中检查它是如何工作的:
http://sqlfiddle.com/#!15/7cdd3/2
本次更新:
UPDATE cidade cid
SET nm_cidade = nv.nm_cidade
FROM novos_valores nv
WHERE cid.cd_cidade = nv.cd_cidade
RETURNING *
返回此结果:
| cd_cidade | nm_cidade | cd_cidade | nm_cidade |
|-----------|-----------|-----------|-----------|
| 1 | 22 | 1 | 22 |
结果包含两个cd_cidade
列。
使用RETURNING cid.*
或RETURNING nv.*
代替RETURNING *
,或列出要在结果中显示的明确列,例如:
RETURNING cid.cd_cidade, nv.nm_cidade, cid.uf