문제

우리는 양식의 테이블이 있습니다.

ID,Value1,Value2,Value3
1,2,3,4

우리는 이것을 변환해야합니다.

ID,Name,Value
1,'Value1',2
1,'Value2',3
1,'Value3',4

하나의 선택된 진술 (즉, 노조가없는)에서 이것을하는 영리한 방법이 있습니까? 열 이름 value1, value2 및 value3는 고정되고 일정합니다.

데이터베이스는 Oracle 9i입니다.

도움이 되었습니까?

해결책

이것은 Oracle 10G에서 작동합니다.

select id, 'Value' || n as name,
       case n when 1 then value1 when 2 then value2 when 3 then value3 end as value
from (select rownum n
      from (select 1 from dual connect by level <= 3)) ofs, t

Oracle 9i가 재귀 쿼리가 있다고 생각합니까? 어쨌든, 나는 그것이 사례 지원이 있다고 확신합니다. 따라서 재귀 쿼리가 없더라도 그냥 할 수 있습니다. "(듀얼 Union 중 1 개를 선택하여 모두 듀얼 Union에서 2 듀얼에서 선택한 2) OFS"OFS. 재귀 쿼리를 남용하는 것은 Oracle에게는 조금 더 일반적인 것입니다. (노동 조합을 사용하여 행을 생성하는 것은 다른 DBS에게는 휴대 할 수 있습니다)

다른 팁

union 샷.

select ID, 'Value1' as Name, Value1 as Value from table_name union all
select ID, 'Value2', Value2 as Value from table_name union all
select ID, 'Value3', Value3 as Value from table_name

order by ID, Name

사용 union all 서버가 a를 수행하지 않음을 의미합니다 distinct (암시 적입니다 union 운영). 데이터와 아무런 차이가 없어야합니다 (신분증이 희망적으로 다르기 때문에) 그러나 약간의 속도를 높일 수 있습니다.

이렇게 할 수는 있지만 예쁘지는 않습니다.

SELECT id,'Value 1' AS name,value1 AS value FROM mytable
UNION
SELECT id,'Value 2' AS name,value2 AS value FROM mytable
UNION
SELECT id,'Value 3' AS name,value3 AS value FROM mytable

세 가지 선정 진술을 조합하여 트릭을 수행해야합니다.

SELECT ID, 'Value1', Value1 AS Value
FROM TABLE
UNION
SELECT ID, 'Value2', Value2 AS Value
FROM TABLE
UNION
SELECT ID, 'Value3', Value3 AS Value
FROM TABLE

SQL Server 2005+를 사용하는 경우 UNPIVOT를 사용할 수 있습니다.

CREATE TABLE #tmp ( ID int, Value1 int, Value2 int, Value3 int)

INSERT INTO #tmp (ID, Value1, Value2, Value3) VALUES (1, 2, 3, 4)

SELECT
    *
FROM
    #tmp

SELECT
    *
FROM
    #tmp
UNPIVOT
(
    [Value] FOR [Name] IN (Value1, Value2, Value3)
) uPIVOT

DROP TABLE #tmp

다른 사람들이 제안한 것처럼 연합은 아마도 SQL에서 가장 좋은 방법 일 것입니다. 특정 요구 사항에 따라 프론트 엔드에서이를 처리하는 것을 고려할 수도 있습니다.

CTE 구문은 Oracle에 대해 다를 수 있지만 (Teradata에서 실행) CTE를 사용하여 테스트 데이터 만 제공했습니다. 실제 선택 문은 일반 바닐라 SQL이며 모든 관계형 데이터베이스에 있습니다.

SQL Server의 경우 UNPIVOT를 Union의 대안으로 고려하십시오.

SELECT id, value, colname
FROM #temp t
UNPIVOT (Value FOR ColName IN (value1,value2,value3)) as X

열 이름도 반환됩니다. X가 무엇에 사용되는지 잘 모르겠지만 남겨 둘 수는 없습니다.

이 시도:

CTE는 4 값의 온도 테이블을 만듭니다. 모든 데이터베이스에서와 같이이 작업을 실행할 수 있습니다.

with TEST_CTE (ID) as

(select * from (select '1' as a) as aa  union all
select * from (select '2' as b) as bb  union all
select * from (select '3' as c) as cc  union all
select * from (select '4' as d) as dd )

select a.ID, 'Value'|| a.ID, b.ID
from TEST_CTE a, TEST_CTE b
where b.ID = (select min(c.ID) from TEST_CTE c where c.ID > a.ID)

결과 세트는 다음과 같습니다.

1   Value1  2

2   Value2  3

3   Value3  4

즐기다!

일부 후에.

^^^ CTE 구문은 Oracle에서 다를 수 있습니다. Teradata에서만 실행할 수있었습니다. 온도 테이블로 대체하거나 구문을 고정하여 Oracle 호환성을 만들 수 있습니다. SELECT 문은 모든 데이터베이스에서 작동하는 일반 바닐라 SQL입니다.

^^^ 또 다른 주목. ID 필드가 숫자 인 경우 "value"로 연결하려면 Char에 캐스트해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top