2009-12-01 2 views
1

각 행마다 user_id, field_id 및 field_value가있는 타사 소프트웨어 (예 : user_fields)가 사용하는 테이블이 있습니다. 진절머리 나 알고있어."사용자 정의 필드"를 업데이트하기 위해 PostgreSQL 행을 여러 행으로 확장하는 방법은 무엇입니까?

"magic"인 field_id를 제외하고 사용자 정의 필드 매핑에 해당하는 값을 포함하는 다른 사용자 테이블도 있습니다. 이 속으로

user_id | company_name  | first_name | country 
--------------------------------------------------- 
1  | Nutty Choc Company | Si   | GB 
2  | Ljubljanske R Us | Pie  | IT 

:

어떻게이 바뀝니다 선택 쿼리를 작성할 수 있습니다? 내가 쿼리를 PostgreSQL을 8.4을 사용하고 의도하고있어

user_id | field_value  | field_id 
--------------------------------------- 
1  | Nutty Choc Company | 10 
1  | Si     | 11 
1  | GB     | 12 
2  | Ljubljanske R Us | 10 
2  | Pie    | 11 
2  | IT     | 12 

은 삽입에 공급한다.

나는 unnest와 배열을 사용하여 필드를 행으로 확장했지만 select의 다른 필드를 처리 한 후에 중첩되지 않으므로 중첩되지 않은 행의 값을 복제합니다.

아이디어가 있으십니까?

건배, 시

편집 : 서식 및 사기 이름 - 값 테이블이 타사이라고 설명.

+0

가독성을 높이려면 코드 예제를 들여 씁니다. –

답변

1

내가 게시 한 다른 답변과는 다른 답변이므로 별도의 답변으로 추가하겠습니다. 이것은 당신이 User_Fields 테이블이 (또는 이름이 지정 될 수 무엇이든)라고 가정한다

SELECT 
    U.id, 
    UF.id AS field_id, 
    CASE UF.id 
      WHEN 10 THEN U.first_name 
      WHEN 11 THEN U.country 
      WHEN 12 THEN U.company_name 
      ELSE NULL 
    END AS field_value 
FROM 
    Users U 
CROSS JOIN User_Fields UF 

당신이 할 수있는 사용자의 모든 필드를 제공합니다 : 당신은 이런 식으로 뭔가를 시도 할 수 있습니다. 귀하의 CASE 성명을 최신으로 유지해야합니다.

+0

도와 줘서 고마워, 톰! 매우 감사 :) –

0

첫 번째 아이디어는 이름 - 값 쌍 아키텍처를 없애는 것입니다. 관계형 데이터베이스에서 여러분은 이미보기 시작하면서 끊임없는 문제를 요구하고 있습니다. 방법 중 필요한 야단와 지금

...

INSERT INTO My_Horrible_Name_Value_Pair_Table 
(
    user_id, 
    field_id, 
    field_value 
) 
SELECT 
    id, 
    10, 
    first_name 
FROM 
    Users 
UNION ALL 
SELECT 
    id, 
    11, 
    country 
FROM 
    Users 
UNION ALL 
SELECT 
    id, 
    12, 
    company_name 
FROM 
    Users 

난 당신이 당신이 더 많은 필드를 추가로 확장하는 방법을 끔찍하게 상상할 수 있음을 확신합니다.

+0

나는 정말로 상상할 수있다. 나는 불행히도 이름 - 값 쌍을 통제하지 못한다. 값이 비싼 기본 조인이 필요하므로 "with"쿼리를 사용하여이 방법을 시도해 볼 수 있습니다. 10, 11, 12에 중첩 된 값을 중첩되지 않은 값에 결합시키는 쉬운 방법이 있습니까? –

관련 문제