2013-08-29 3 views
3

기존 테이블에 새 열을 만들고 select 문을 사용하여 나누기를 수행하여 새 열에 삽입하려고합니다. 필자가 작성한 여러 문장은 별도의 쿼리로 작동하지만 하나의 쿼리로 문장을 함께 묶을 수는 없습니다.테이블에 열을 추가하고 PostgreSQL에서 바로 데이터를 추가합니다.

저는 여전히 SQL을 배우고 있으며, mySQL과 PostgreSQL에서 사용하고 있습니다. 저는 지난 달 SQL에 대해 수업을 들었습니다. 이제는 제 능력을 유지하기 위해 자신의 프로젝트를 수행하려고합니다.

2012 년 선거에서 MN의 테이블 결과를 사용하여 작업하고있는 데이터를 이해하고 있습니다.

나는 테이블을 변경하고이 문장을 사용하여 새 컬럼을 추가 할 수있었습니다.

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) 
ALTER TABLE mn2012ct_geom2 ADD COLUMN romney_pct decimal(10,2) 

이 선택 문을 사용하여 터미널 응용 프로그램에서 원하는 정보를 얻을 수있었습니다. 내가 여기서하려고하는 것은 후보자가 던진 총 투표 수를 넘은 투표 수에서 십진수를 작성하는 것입니다.

SELECT CAST (obama AS DECIMAL)/CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2 

SELECT CAST (romney AS DECIMAL)/CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2 

는 지금은 나도 내가이 쿼리 전에 열을 만드는 경우 나 위 또는 삽입 문이 같은 ALTER TABLE 문으로 만든 새 열에 추가 정보를 갖고 싶어.

나는이 같은 결합 된 쿼리를 시도 :

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS 
(SELECT CAST (obama AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)) 
AS obama_pct FROM mn2012ct_geom2); 

또는

대신 테이블 변경 문

INSERT INTO mn2012ct_geom2 (romney_pct) AS 
(SELECT CAST (romney AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)) 
AS romney_pct FROM mn2012ct_geom2); 

나는 그것이 추방 그렇게하려고이 라인 같은 삽입 명령을 사용하여 다음과 같은 오류 :

ERROR: syntax error at or near "AS" 
LINE 1: ...mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS (SELECT... 

나는 그 종류의 Alter 테이블을 생각하고 컬럼을 추가했다. 같은 insert 문을 사용하여 새 테이블을 만들 때 해당 형식이 작동했기 때문에 insert가 작동합니다.

CREATE TABLE obama_pct AS (SELECT CAST (obama AS DECIMAL (10,2))/CAST (uspres_total  
AS DECIMAL (10,2)) AS obama_pct FROM mn2012ct_geom2); 

도움을 주시면 큰 도움이됩니다. 나는 Google에 노력하고 여기에 stackoverflow에 대한 답변을 찾을 수 있지만 내가 뭘 찾았는지 정확히 내가하고있는 일을 맞는 것 같습니다.

답변

5

이 테이블에 계산 된 데이터를 추가하는 것은 좋은 생각이 아니다. 때때로 테이블을 다시 정규화 할 때 필요하지만 대개 완료되지는 않습니다.

고든 (Gordon)이 말했듯이 여기에서 할 적절한 일은 create a view입니다. the tutorial을 참조하십시오.

ALTER TABLE ... ADD COLUMN ... AS가 없습니다.구문을 구성 할 수있는 것은 아니므로 documentation for the command you're interested in을 사용하여 구문을 사용하는 방법을 찾아야합니다. psql에있는 \h 명령도 유용합니다 (예 : \h alter table).

다른 열의 계산을 기반으로 새 열의 값을 설정해야하는 경우 열을 만든 후 ALTER TABLE ... ADD COLUMN ... DEFAULT ... 다음에 DROPDEFAULT이라는 용어를 사용하십시오. 빈 칸과 nullable을 작성한 다음 UPDATE 문으로 채우는 것이 더 좋습니다.

예. 검증되지 않은 예 :

BEGIN; 

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2); 

UPDATE mn2012ct_geom2 SET romney_pct = CAST (romney AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2); 

COMMIT; 

또는, 다소 이보다 :

BEGIN; 

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) NOT NULL DEFAULT (CAST (obama AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)); 

ALTER TABLE mn2012ct_geom2 ALTER COLUMN obama_pct DROP DEFAULT; 

COMMIT; 
+0

조언과 도움을 주셔서 감사합니다. 전망을 잘 살펴보고 어떻게 작동하는지 봅니다. –

3

나는 update 성명을 찾고 있다고 생각합니다. 예를 들어 :

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2); 

update mn2012ct_geom2 
    set obama_pct = CAST(obama AS DECIMAL)/CAST(uspres_total AS DECIMAL); 

또한 바로 계산을 할 뷰를 작성하는 것이 좋습니다 : 일반적으로

create view v_mn2012ct_geom2 as 
    select g.*, CAST(obama AS DECIMAL)/CAST(uspres_total AS DECIMAL) as mn2012ct_geom2 
    from mn2012ct_geom2; 
+0

는 도와 주셔서 감사하고 의견을 주셔서 감사합니다. Craig 's를보고 나는 당신이 세트 부분을 빠뜨린 것을 보았고, 나는 왜 일할 대답을 먼저 얻을 수 없었는지를 보았다. –