(또는 빠른하지 않을 수 있음) 고든의 대답에 대한 대안과 같이, 부분 간은 2 행 더미 "테이블"에 가입하는 것입니다 :
WITH your_table AS (SELECT 1 ID, 999 paramcomp, 'a' colval FROM dual UNION ALL
SELECT 1 ID, 80 paramcomp, 'b' colval FROM dual UNION ALL
SELECT 2 ID, 999 paramcomp, 'c' colval FROM dual UNION ALL
SELECT 3 ID, 85 paramcomp, 'd' colval FROM dual UNION ALL
SELECT 4 ID, 999 paramcomp, 'e' colval FROM dual UNION ALL
SELECT 4 ID, 75 paramcomp, 'f' colval FROM dual UNION ALL
SELECT 4 ID, 70 paramcomp, 'g' colval FROM dual)
-- end of mimicking your table; see SQL below:
SELECT yt.ID,
yt.paramcomp,
case WHEN dummy.id = 1 THEN yt.colval
WHEN dummy.id = 2 THEN yt.paramcomp_999_colval
END colval
FROM (SELECT ID,
paramcomp,
colval,
MAX(CASE WHEN paramcomp = 999 THEN colval END) OVER (PARTITION BY ID) paramcomp_999_colval
FROM your_table) yt
INNER JOIN (SELECT 1 ID FROM dual UNION ALL
SELECT 2 ID FROM dual) dummy ON dummy.id = 1 -- ensures every yt row is returned
OR (dummy.id = 2
AND paramcomp_999_colval IS NOT NULL
AND yt.paramcomp != 999) -- returns an extra row if the 999 paramcomp row exists but the current row isn't 999
ORDER BY yt.ID, yt.paramcomp DESC, yt.colval;
ID PARAMCOMP COLVAL
---------- ---------- ------
1 999 a
1 80 b
1 80 a
2 999 c
3 85 d
4 999 e
4 75 e
4 75 f
4 70 g
4 70 e
이 있다고 가정 오직 하나의 999 paramcomp 행 (예 : (id, paramcomp)에 대한 고유 제한 조건이 있음).
데이터와 성능면에서 가장 뛰어난 결과를 보려면 고든의 답변을 테스트해야합니다.
ETA : 당신이 비교 여기 고든의 대답의 고정 된 버전입니다 :
select id, paramcomp, colval
from your_table
union all
select id, paramcomp, paramcomp_999_colval colval
from (select yt.*, MAX(CASE WHEN paramcomp = 999 THEN colval END) OVER (PARTITION BY ID) paramcomp_999_colval
from your_table yt
) t
where paramcomp_999_colval IS NOT NULL and paramcomp <> 999
ORDER BY ID, paramcomp DESC, colval;
, η2 :
당신 경우 : 더미 테이블의 사용을 더 설명 테이블의 모든 행을 복제하려면 다음과 같이 두 행이있는 테이블/하위 쿼리에 대한 교차 조인을 수행하십시오.
SELECT *
FROM your_table yt
CROSS JOIN (SELECT 1 ID FROM dual UNION ALL
SELECT 2 ID FROM dual) dummy;
ID PARAMCOMP COLVAL ID
---------- ---------- ------ ----------
1 999 a 1
1 80 b 1
2 999 c 1
3 85 d 1
4 999 e 1
4 75 f 1
4 70 g 1
1 999 a 2
1 80 b 2
2 999 c 2
3 85 d 2
4 999 e 2
4 75 f 2
4 70 g 2
그러나 중복 행이 항상 나타나기를 원하지는 않으므로 조금 선택적으로 내부 조인을 수행해야합니다. 내 초기 답변에서 내부 조인을 무너 뜨릴 것이므로 조금 더 잘하고 있는지 잘 볼 수 있습니다.
우선, 여기의 부분 년대 그 your_table의 각 행이 반환되는 것을 보장 가입 :
SELECT *
FROM your_table yt
INNER JOIN (SELECT 1 ID FROM dual UNION ALL
SELECT 2 ID FROM dual) dummy ON dummy.id = 1;
ID PARAMCOMP COLVAL ID
---------- ---------- ------ ----------
1 999 a 1
1 80 b 1
2 999 c 1
3 85 d 1
4 999 e 1
4 75 f 1
4 70 g 1
다음, 여기가 그
SELECT *
FROM your_table yt
INNER JOIN (SELECT 1 ID FROM dual UNION ALL
SELECT 2 ID FROM dual) dummy ON dummy.id = 2
AND yt.paramcomp != 999;
ID PARAMCOMP COLVAL ID
---------- ---------- ------ ----------
1 80 b 2
3 85 d 2
4 75 f 2
4 70 g 2
당신을 연결하는 선택적 보장 가입의 일부 이 두 번째 부분에서 우리가 아직 id = 3 행을 얻었음을 알 수 있습니다. 그래서 위의 마지막 대답에서 paramcomp = 999 행의 colval이 조건부 최대 분석 함수를 사용하여 모든 행에 대해 반환되고 반환된다는 것을 알았습니다. 그런 다음 두 번째 조인 조건 부분에 추가하여 999 colval을 갖는 행만 반환합니다 (값이없는 경우 999 행이 존재하지 않는다고 가정합니다). 이것은 colval이 항상 999 행에 존재한다고 가정합니다.
샘플 데이터가 지정한 규칙을 따르지 않는다고 생각합니다. 그렇다면'id = 1'은 999를 갖는 두 개의 행을 가질 것입니다. 질문을 명확히하십시오. –
"열 복제"라고 말하면 행을 의미합니까? 생성 된 추가 열은 표시되지 않습니다. 그런 다음 : 기존 행을 기반으로 새 행을 만들지 만 ParamComp 값이 다른 경우 "중복"도 아닙니다. 그리고 제목에서 : 관계형 데이터베이스는 "레코드"보다는 "행"을 가지고 있습니다. – mathguy
@GordonLinoff ID의 경우 999가 ColVal 값 999에 따라 다른 행이 복제됩니다 (ID에 ParamComp 값이 '999'이고 999가 아닌 값인 경우). –