2014-04-11 4 views
1

하나의 행을 생성하는 쿼리가 있습니다. 이 한 행을 여러 번 출력하고 싶습니다.이 쿼리에서 상수로 결정했습니다. 하지만 내가 원하는 것은 상수가 3 점을 감안이다동일한 행을 여러 번 선택하십시오.

[A.a, B.b, C.c] 

:

[A.a, B.b, C.c] 
[A.a, B.b, C.c] 
[A.a, B.b, C.c] 

하는 것은 쉬운 거기에이 결과를 제공

select A.a, B.b, C.c from A 
inner join B .. 
inner join C .. 
where A.a =.. and B.b = .. and C.c = .. 

: 쿼리 형식에 이 일을하는 방법? 숫자 값을 사용하여 값을 반복해야하는 횟수를 지정해야하므로 UNION ALL을 반복하여 쿼리를 사용하면 작동하지 않습니다. 이 값은이 쿼리와 함께 iReport으로 만든 보고서의 매개 변수가됩니다. iReport에서도 가능하지만 매우 오래된 버전 인 iReport (3.0.0)에서 가능해야합니다. 어떤 도움을 주시면 감사하겠습니다. 몇 시간 동안 인터넷 검색을 해왔지만 제대로 작동하는 솔루션을 찾을 수 없습니다. 간단한 작업이어야하는 것 같습니다.

답변

2

왜 필요한가요? 내가 생각하고 한 가지 방법은 100 행 (1부터 100까지 숫자)와 번호 테이블을 가지고 있고 십자가는 원래 쿼리

select t1.* from 
(
select A.a, B.b, C.c from A 
inner join B .. 
inner join C .. 
where A.a =.. and B.b = .. and C.c = .. 
) as t1 inner join number_table on 1=1 
where number<=3 
+0

내가하려는 것은 주어진 기사에 대한 N 바코드 라벨을 인쇄하는 보고서를 만드는 것입니다. 이 솔루션은 잘 작동합니다. 그러나 나는 새로운 테이블을 만들 필요가없는 것이 있기를 기대하기 때문에 잠시 동안이 대답을 받아 들일 것입니다. –

+0

실제 테이블을 가지고 있습니다. 메모리에 생성 된 테이블에는 몇 가지 단점이 있습니다. 주로 비즈니스 가치가없는 데이터베이스 객체로 끝날 것이며 영구적으로 유지 보수 루틴의 일부입니다. 재귀 CTE와 같이 생성 된 테이블을 사용하여 여러 행을 생성하는 대신 실제 테이블을 사용하는 강력한 이유는 없습니다. –

0

이 조금 해결 방법입니다 함께 참여,하지만 당신은 테이블을 만들 수 있습니다, 그것은 포함 예를 들어 1에서 10까지의 숫자입니다. 그런 다음 number_in_aux_table < = 상수가있는 테이블에 행을 가입시킬 수 있습니다.

2

당신은 당신이 원하는대로 다음, 많은 행이 "테이블"을 생성하는 재귀 SQL을 사용하여 원래 쿼리, 그런 식으로 가입 할 수 있습니다 :

with somerows(i) as (
    select 1 from sysibm.sysdummy1 
    union all 
    select i+1 from somerows 
    where i < ? -- this host variable would specify the number of rows 
) 
select A.a, B.b, C.c from 
somerows, 
A 
inner join B .. 
inner join C .. 
where A.a =.. and B.b = .. and C.c = .. 
1

당신이 사용하는 테이블에 필요합니다 Cartesian product입니다. 카디 전 곱을 사용하면 비즈니스 데이터 결과에 테이블의 행 수를 곱합니다.

필자는 테이블을 실제 테이블이 아닌 메모리 내 테이블로 생성합니다. 그렇게하면 유지 관리 할 추가 데이터베이스 개체가 없습니다. 실제 테이블로 숫자 테이블을 만들 수있는 유일한 이유는 성능 최적화로서 항상 메모리에 테이블을 구축하는 데 드는 비용이 들지 않기 때문입니다. 하지만 도움이 될지는 모르겠다. 평가를 위해 약간의 측정을해야 할 것이다.

여러 가지 방법으로 그 메모리 테이블을 만들 수 있습니다

  1. 재귀 SQL을.
  2. 선언 된 전역 임시 테이블, 삽입 하시겠습니까? 숫자를 입력하십시오.
  3. 한 행의 묶음이한데 묶입니다.

이러한 옵션 중 하나를 선택하면 재귀 적 SQL이 가장 좋은 옵션이됩니다. 단일 SQL 문으로 원하는 결과를 얻을 수 있고 유연성을 갖출 수없는 응용 프로그램을 사용하려는 것처럼 들릴 수 있기 때문입니다 이러한 복잡한 프로세스 중 일부. 나머지 두 개는 동적으로 SQL 문 작성 (유니온 모두의 경우) 또는 프로그램을 여러 번 사용하여 삽입해야합니다.

DB2의 재귀 SQL의 경우 원하는 행 수를 생성하려면 기본 Recursive CTE을 작성하십시오.

코드가 가능한 명확 해 지도록 실제 비즈니스 쿼리와 별도로 재귀 부분을 유지하십시오. 6 개월 만에 다시 돌아 왔을 때 마음에 들지는 않았지만 생성 된 값과 비즈니스 데이터 SQL 간의 명확한 구분을 볼 수 있기를 원합니다.

상단에 재귀 CTE를 추가하고 원래 쿼리의 FROM 절에 대한 참조를 넣습니다. 필요한 모든 것 :

+0

예, 재귀 CTE 옵션을 직접 사용하고 싶습니다 (다른 옵션을 완전히 무시할 것입니다). 사용 가능한 예제를 줄 수 있습니까? –

관련 문제