문제

매우 긴 SQL 쿼리 후에이 형식의 결과가 있습니다.

 col1 | col2 | col3 | col4
------+------+------+-----
1234  | 1    | aaaa | bbbb
2378  | 0    | aaaa | bbbb
9753  | 1    | cccc | uuuu
1234  | 0    | iiii | yyyy
2378  | 1    | iiii | yyyy
9753  | 1    | tttt | mmmm

그러나 나는 이런 식으로 그것을 필요로하지 않습니다. 이 결과에 대해 사용해야하는 다른 SQL 진술을해야합니다. 그룹에 의해 세 번째 및 포장 열. 다시 말해서, 다음과 같이 하나의 두 줄입니다.

col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1    | 2378 | 0    | aaaa | bbbb
1234 | 1    | 2378 | 0    | aaaa | bbbb
9753 | 1    | null | null | cccc | uuuu
1234 | 0    | 2378 | 1    | iiii | yyyy
9753 | 1    | null | null | tttt | mmmm
도움이 되었습니까?

해결책

쿼리에서 열을 매핑 할 구조가있는 두 개의 추가 테이블 (임시 여부, 요구 사항에 따라 다르지 않음)을 만들어 해당 문제를 해결할 수 있습니다.

예를 들어:

CREATE TABLE TableA (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

CREATE TABLE TableB (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

이것은 제시 한 출력 데이터를 기반으로 한 예제 구조 일뿐입니다.

이 두 테이블을 만든 후에는 쿼리에서 각 테이블로 데이터를 삽입해야합니다.

추가 :동일한 쿼리를 두 번 실행할 필요가 없습니다. 한 번 실행하고 데이터를 Tablea에 넣은 다음 Tablea에서 선택하고 데이터를 tableb에 넣습니다. 그것은 당신에게 많은 시간을 절약 할 것입니다.

마지막 단계는 col3 및 col4 열에 결합 된 Tablea 및 TableB의 쿼리를 Perfrom 쿼리하는 것입니다. 이 같은:

SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)  
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4

이것이 도움이되기를 바랍니다.

또한이 솔루션에는 하나의 주요 단점이 있습니다.

오리널 쿼리에서 열 수 또는 데이터 유형을 변경하면 테이블 정의도 업데이트해야합니다. 이에 대한 가능한 해결책은 동적 SQL을 사용하는 것이지만 일반적으로 유행되지 않습니다.

편집 후 (출력 데이터에 추가 널을 제공 했음) :

NULL 값을 유지하려면 다른 조인을 사용해야합니다. LEFT OUTER JOIN

또 다른 가능한 솔루션은 다음과 같습니다.

  1. 긴 쿼리로 교체 (dbo.test)를 교체하십시오. 그러나 쿼리가 두 번 실행됩니다.

    A. *, B. *에서 (DBO.Test에서 선택 * 선택) A 왼쪽 외부 조인 (DBO.Test) B에서 A.Col3 = B.Col3 및 A.Col4 = B.Col4 및 A.Col1을 선택하십시오. <> B.col1 및 A.col2 <> B.col2

  2. SQL 2005를 사용하는 경우 Cross Apply Operator를 사용할 수 있습니다.

다른 솔루션이있을 수 있지만 사용하는 SQL 엔진과 데이터베이스에 대한 귀하의 권한에 대해 더 설명해야합니다.

다른 팁

흠,

결과를 임시 테이블에 던져 넣었습니다. 그럼

select 
a.col1, 
a.col2, 
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5, 
coalesce(a.col4,b.col4) as col6 
from #tmp a 
outer join #tmp b 
on a.col3 = b.col3 and a.col4 = b.col4 
where a.col2 = 0 and b.col2 = 1

이것은 COL2가 당신이 가진 쌍의 어느 부분을 나타내는 지표라고 가정합니다.

첫 번째 솔루션을 기반으로 올바른 솔루션을 찾았습니다. @wodzu.

먼저 결과를 포함 할 임시보기를 만듭니다.

TMP AS (-MY 매우 긴 SQL 문 ...)

둘째, 두 가지가 있으므로 선택을 선택하십시오. 이런 식으로 쿼리는 한 번만 호출됩니다.

TMP에서 a. **, b. **를 선택하십시오.

감사합니다 Wodzu

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