PostgreSQL模棱两可的错误

时间:2016-01-07 20:40:48

标签: postgresql

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

1 个答案:

答案 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 *返回cidadenovos_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