문제

PostgreSQL 데이터베이스에 큰 쿼리가 있습니다. 쿼리는 다음과 같습니다.

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

이 쿼리를 SQL 쿼리로 실행하면 원하는 행을 반환합니다.

그러나 동일한 쿼리를 사용하여보기를 만들려고하면 오류가 반환됩니다.

"오류 : 열"ID "열이 두 번 이상 지정되었습니다."

(쿼리를 실행할 때 pgadminiii를 사용합니다.)

결과 세트에 "ID"라는 열이 하나 이상 있기 때문에 이런 일이 발생한다고 생각합니다. 쿼리의 모든 열 이름을 쓰지 않고 이것을 해결할 수있는 어쨌든 있습니까?

도움이 되었습니까?

해결책

뷰는 select *로 인해 표 1에서 하나와 표 2에서 하나라는 두 개의 ID라는 열이 있기 때문에 발생합니다.

보기에 원하는 ID를 지정해야합니다.

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

쿼리는 똑같이 명명 된 열을 가질 수 있기 때문에 작동합니다 ...

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

다른 팁

결합 열만 복제 된 경우 (즉, 동일한 이름이 있습니다) 변경 사항으로 도망 갈 수 있습니다.

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

에게:

select *
from a join b using (id)

당신이 다음과 같은 함수를 사용하려고했기 때문에 여기에 도착했다면 to_date "두 번 이상 정의 된"오류를 얻으려면 함수에 열 별칭을 사용해야합니다.

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

언어를 해결할 수있는 내장 방법은 없습니다 (그리고 솔직히 * *는 테이블 스키마가 변경됨에 따라 잠재적 결함이 발생할 수 있기 때문에 일반적으로 나쁜 관행입니다. Table1. *, table2.acolumn, tabcolumn을 수행 할 수 있습니다. 하나의 테이블을 모두 원하고 다른 테이블을 선택적으로 원한다면) PostgreSQL이 information_schema를 지원하는 경우 다음과 같은 작업을 수행 할 수 있습니다.

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

그리고 많은 타이핑을 저장하기 위해 결과를 붙여 넣습니다. 물론 동일한 이름을 가진 열을 수동으로 별칭해야합니다. 원하는 경우 코드-그린 고유 이름도 할 수 있습니다 (그러나 나는 그렇지 않습니다).

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top