2016-01-07 44 views
0
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) 

上面的查詢返回下面的錯誤,但我只是不能看到它在哪裏,任何人都可以幫助我嗎?PostgreSQL含糊錯誤

SQL Error:

ERROR: column reference "cd_cidade" is ambiguous LINE 11: ...
WHERE NOT 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

檢查:'UPDATE CID SET nm_cidade = nv.nm_cidade,UF = nv.uf FROM novos_valores nv JOIN cidade cid USING(cd_cidade) RETURNING *' – lad2025

回答

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

+0

謝謝你!這解決了我的問題! ;) –