database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 28086 게시물 읽기
No. 28086
[질문]Select 문에서 자동 반복 쿼리?
작성자
초보
작성일
2009-03-12 18:24ⓒ
2009-03-12 19:29ⓜ
조회수
12,015

데이타가 시작일이 2009-03-05 이고 종료일이 2009-04-10 인 경우

SELECT 문을 사용해서

저장된 데이타가

번호     시작일          종료일
No_01   2009-03-05   2009-03-07
No_02   2009-03-10   2009-03-12
No_03   2009-03-06   2009-03-06
No_04   2009-03-06   2009-03-07

일때 결과가

No_01 2009-03-05
No_01 2009-03-06
No_01 2009-03-07
No_02 2009-03-10
No_02 2009-03-11
No_02 2009-03-12
No_03 2009-03-06
No_04 2009-03-06
No_05 2009-03-07

이런식으로 가능한가요?

버젼은 5.0 입니다.

오늘 하루종일 머리를 굴려도 해결방법이 없네요..
부탁드립니다.

* PROCEDURE  를 처음 사용하려고 하는데 아래처럼 여기저기 찾아서 만들었는데 에러가 많이 나네요
어디부분이 잘못된건지 알려주세요.

DROP TABLE IF EXISTS mytable;
create table mytable(Auto_No int AUTO_INCREMENT, Si_Ymd varchar(8), End_Ymd varchar(8), Input_Ymd varchar(8), PRIMARY KEY (Auto_No));
create table rettable(Auto_No int AUTO_INCREMENT, input_Ymd varchar(8), PRIMARY KEY (Auto_No));
INSERT INTO mytable(si_ymd,end_ymd) values ('20090302','20090304'),('20090304','20090306'),('20090320','20090410');
select * from mytable;

DELIMITER  //
drop procedure if exists inc_date;
create procedure inc_date(in si_ymd, in end_ymd, out input_ymd)
begin
   set @s_ymd = si_ymd;
   set @e_ymd = end_ymd;
   while (@s_ymd <= @e_ymd) do
      set @c_ymd = Date_Add(@s_Ymd,interval 1 day);
      insert into rettable (input_ymd) values (@c_ymd);
      @s_ymd = @c_ymd;
   end while;
end;
//
delimiter;

이 글에 대한 댓글이 총 6건 있습니다.

ORACLE 에서는 이렇게 가능한데... 참고하세요..

WITH TEMP AS (
    SELECT 'NO_01' NO,TO_DATE('2009-03-05','YYYY-MM-DD') S_DATE,TO_DATE('2009-03-07','YYYY-MM-DD') E_DATE, 3 CNT FROM DUAL UNION ALL
    SELECT 'NO_02' NO,TO_DATE('2009-03-10','YYYY-MM-DD') S_DATE,TO_DATE('2009-03-12','YYYY-MM-DD') E_DATE, 3 CNT FROM DUAL UNION ALL
    SELECT 'NO_03' NO,TO_DATE('2009-03-06','YYYY-MM-DD') S_DATE,TO_DATE('2009-03-06','YYYY-MM-DD') E_DATE, 1 CNT FROM DUAL UNION ALL
    SELECT 'NO_04' NO,TO_DATE('2009-03-06','YYYY-MM-DD') S_DATE,TO_DATE('2009-03-07','YYYY-MM-DD') E_DATE, 2 CNT FROM DUAL
)
SELECT    A.NO
     ,    A.S_DATE + B.SEQ - 1  S_DATE
     ,    A.E_DATE
  FROM    TEMP  A
     ,  ( SELECT    ROWNUM  SEQ
            FROM    DUAL
          CONNECT BY LEVEL <= 3
        )       B
 WHERE    A.S_DATE + B.SEQ - 1 <= A.E_DATE
 ORDER BY 1,2

강영화님이 2009-03-12 20:07에 작성한 댓글입니다. Edit

감사합니다.

오라클에 대해서는 문외한이라서

소중한 답변을 이해를 못하고 있습니다. 고맙습니다.

초보님이 2009-03-13 08:57에 작성한 댓글입니다. Edit

지난번에도 copy_t 테이블을 소개한 적이 있었는데 여기서도 다시 쓰겠습니다. 
데이터의 복제 및 집계 쿼리 등에서 많이 사용하는 방식중에 하나입니다. 

create table copy_t
(
    no     int(2) unsigned    not null    primary key,
    cno    varchar(2)         not null
);

insert into copy_t
select  1 no, '01' cno union all
select  2 no, '02' cno union all
select  3 no, '03' cno union all
select  4 no, '04' cno union all
select  5 no, '05' cno union all
select  6 no, '06' cno union all
select  7 no, '07' cno union all
select  8 no, '08' cno union all
select  9 no, '09' cno union all
select 10 no, '10' cno;


CREATE TABLE `test`.`test_t` (
  `no` VARCHAR(5) NOT NULL,
  `s_dt` DATE NOT NULL,
  `e_dt` DATE NOT NULL
)
ENGINE = InnoDB;

insert into test_t
values
('No_01', '2009-03-05', '2009-03-07'),
('No_02', '2009-03-10', '2009-03-12'),
('No_03', '2009-03-06', '2009-03-06'),
('No_04', '2009-03-06', '2009-03-07');

copy_t를 이용하면 데이터를 다음과 같이 복제할 수 있습니다. 

select a.no, date_add(s_dt, interval b.no - 1 day) dt 
       #, a.no, a.s_dt, a.e_dt, b.no
  from test_t a, copy_t b
 where date_add(s_dt, interval b.no - 1 day) between s_dt and e_dt
 order by a.no, b.no;

구헌수(madcat)님이 2009-03-13 10:33에 작성한 댓글입니다.

와우.. 감사합니다.

이해는 안되지만 지금 프로그램에 넣어야 겠습니다.

정말 감사합니다. 


그런데


insert into copy_t

select  1 no, '01' cno union all

select  2 no, '02' cno union all

select  3 no, '03' cno union all

select  4 no, '04' cno union all

select  5 no, '05' cno union all

select  6 no, '06' cno union all

select  7 no, '07' cno union all

select  8 no, '08' cno union all

select  9 no, '09' cno union all

select 10 no, '10' cno;


이 부분이 잘 이해가 안됩니다.

이부분이 insert into copy_t (1,'01'),(2,'02')... 이 것과 다른건가요?

그리고 copy_t 이것을 어느정도 만들어야 하는건가요?

두 날짜 사이의 최대 범위만큼해야 하는건가요?


아래부분이 잘 이해가 안되서...

초보님이 2009-03-13 18:02에 작성한 댓글입니다. Edit

1. 같은 기능을 다르게 표현한 것이라고 생각하세요.

2. copy_t의 레코드 수는 원하는 만큼 지정하시면 됩니다. 

다만 쿼리 작성시 full scan되지 않도록 주의해서 작성하시기 바랍니다.

구헌수(madcat)님이 2009-03-14 09:24에 작성한 댓글입니다.

감사합니다.
loop 문으로 열심히 돌린것을
쿼리문으로 해결했습니다.

설명도 고맙습니다.

초보님이 2009-03-14 11:08에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
28089Can't create/write to file '/tmp/ibJaLUty' (Errcode: 13) [1]
khi
2009-03-14
8546
28088utf-8 검색 [1]
지윤성
2009-03-13
5239
28087order by 에서 형 변환 되나요? [2]
초보
2009-03-13
5270
28086[질문]Select 문에서 자동 반복 쿼리? [6]
초보
2009-03-12
12015
28085max_connection이 440을 넘지 못합니다. [1]
박찬영
2009-03-12
5516
28084두개의 테이블에서 자료 추출하기.. [1]
석이
2009-03-11
5066
28083like 검색 질문입니다. [2]
초보
2009-03-11
5074
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다