2008-10-16 33 views
9

Tôi có một truy vấn lớn trong cơ sở dữ liệu PostgreSQL. Các Query là một cái gì đó như thế này:Xem lỗi trong PostgreSQL

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

Khi tôi chạy truy vấn này như một truy vấn sql, nó sẽ trả về hàng mong muốn.

Nhưng khi tôi cố gắng sử dụng cùng một truy vấn để tạo ra một cái nhìn, nó sẽ trả về một lỗi:

"lỗi: Cột ''. Quy định nhiều hơn một lần" id

(tôi sử dụng pgAdminIII khi thực hiện các truy vấn.)

tôi sẽ đoán điều này xảy ra bởi vì resultset sẽ có nhiều hơn một cột có tên là "id". Có cách nào để giải quyết điều này, mà không cần viết tất cả các tên cột trong truy vấn?

Trả lời

11

Điều đó xảy ra vì một lượt xem sẽ có hai cột có tên là id, một từ bảng 1 và một từ bảng 2, vì lựa chọn *.

Bạn cần chỉ định id nào bạn muốn trong chế độ xem.

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

Truy vấn làm việc vì nó có thể đã không kém tên cột ...

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

Có cách nào để tự động thêm tên bảng vào tên cột trong kết quả của truy vấn SELECT * không? – nnyby

-2

Không tích hợp cách trong ngôn ngữ để giải quyết nó (và thẳng thắn, * là một thói quen xấu nói chung vì nó có thể gây ra lỗi tiềm ẩn khi các lược đồ bảng thay đổi - bạn có thể làm table1. *, table2.acolumn, tabl2.bcolumn nếu bạn muốn tất cả một bảng và chọn lọc từ bảng khác), nhưng nếu PostgreSQL hỗ trợ INFORMATION_SCHEMA, bạn có thể làm điều gì đó như:

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 

Và dán kết quả vào để tiết kiệm rất nhiều cách gõ. Bạn sẽ cần phải tự bí danh các cột có cùng tên, tất nhiên. Bạn cũng có thể mã gen tên duy nhất nếu bạn thích (nhưng tôi không):

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

không có gì giống như @SOMETHING trong PostgreSQL. –

+0

Cũng không sử dụng [] để báo số nhận dạng. Và không phải hàm CHAR(). Và không có tuyên bố PRINT. –

11

Nếu chỉ tham gia các cột được nhân đôi (tức là có cùng tên), sau đó bạn có thể nhận được ngay với thay đổi:

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

tới:

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

Điều này không khắc phục được lỗi, nhưng dù sao nó cũng là cú pháp đẹp hơn. –

0

Nếu bạn đến đây bởi vì bạn đang cố gắng sử dụng một chức năng như to_date và nhận được "định nghĩa nhiều hơn một lần" lỗi, lưu ý rằng bạn cần phải sử dụng một bí danh cột cho các chức năng , ví dụ:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date 
Các vấn đề liên quan