2008-10-16 10 views
9

PostgreSQL veritabanında büyük bir sorgum var. Bir sql sorgusu olarak bu sorguyu çalıştırdığınızdaHataları ViewgreSQL içinde görüntüleme

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id... 

, bu istenilen satır döndürür: Sorgu böyle bir şeydir.

Ama bir görünüm oluşturmak için aynı sorguyu kullanmaya çalıştığında, bu hata verir:

"hata: Sütun ''. Birden çok kez belirtildi" id

(sorguları yürütme zaman pgAdminIII kullanın.)

Ben resultset "id" adında birden fazla sütun da yer alır çünkü bu olur sanırım edeceğiz. Sorgudaki tüm sütun adlarını yazmadan bunu çözmek için bir yer var mı?

cevap

11

Bunun nedeni, bir görünümün, select * nedeniyle biri tablo 1'den, diğeri tablo2 olmak üzere iki tane adlandırılmış sütun içermesidir.

Görünümde hangi kimliği istediğinizi belirtmeniz gerekir. eşit sütun adı var çünkü sorgu çalışır

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id 

... dilinde

postgres=# select 1 as a, 2 as a; 
a | a 
---+--- 
1 | 2 
(1 row) 

postgres=# create view foobar as select 1 as a, 2 as a; 
ERROR: column "a" duplicated 
postgres=# create view foobar as select 1 as a, 2 as b; 
CREATE VIEW 
+3

SELECT * sorgusu sonucunda tablo adlarını otomatik olarak sütun adlarına eklemenin bir yolu var mı? – nnyby

-2

Hayır yerleşik yolu (çözmek ve açıkçası için, * çünkü genel olarak kötü bir uygulamadır Tablo şemaları değiştikçe gizli hataların ortaya çıkmasına neden olabilir - tablo1. *, tablo2.acolumn, tabl2.bcolumn, bir tablonun tümünü ve diğerini seçici olarak isterseniz) ancak PostgreSQL, INFORMATION_SCHEMA'yı destekliyorsa, bir şey yapabilirsiniz gibi:

DECLARE @sql AS varchar 

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 

PRINT @sql 

Çok fazla yazarak kaydetmek için sonuçları yapıştırın. Elbette, aynı ada sahip sütunları elle hizalamanız gerekecektir. Ayrıca kod-gen benzersiz adlar sizin gibi eğer (ama yok):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] ' 
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 
+0

PostgreSQL'de @SOMETHING gibi bir şey yoktur. –

+0

Ayrıca, tanımlayıcıları alıntılamak için [] kullanma yok. CHAR() işlevi değil. Ve PRINT ifadesi yok. –

11

okunur sütunlar çoğaltıldığı katılırsanız (yani aynı adlara sahip), o zaman değişen kurtulabilir:

select * 
from a, b 
where a.id = b.id 

için:

select * 
from a join b using (id) 
+0

Bu hatayı düzeltmedi, ancak yine de güzel bir sözdizimi. –

0

Eğer to_date gibi bir işlevi kullanmaya çalışıyorum ve "birden çok kez tanımlanan" hatası alıyorsanız çünkü burada var ise, işlevleri için bir sütun takma ad kullanmak gerektiğini unutmayın örneğin:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date 
İlgili konular