한 행씩 반복해서 비교하는 쿼리는 어떻게 해야 할까요? 0 5 502

by 알수없음 [SQL Query] [2019.06.20 17:32:21]



테이블1 에 시작날짜, 종료날짜 컬럼이 있고,

테이블2 에 시작날짜, 종료날짜 컬럼이 있는데요.

SELECT 시작날짜, 종료날짜

FROM 테이블2

WHERE 테이블2.시작날짜 > 테이블1.시작날짜 AND 테이블2.종료날짜 < 테이블1.종료날짜

 

이렇게 테이블1의 모든행을 비교해서 합쳐진 결과를 가져오고 싶은데요.

 

어떻게 해야할까요?

 

어플리케이션에서 합칠수 없는 상황입니다.

 

테이블1의 날짜 컬럼 표시 방식 이상은 무시하셔도 됩니다.

날짜는 상관없고 시간만 범위내에 속하면 됩니다.

by 마농 [2019.06.20 18:51:25]

FROM 절에 테이블1 을 추가하면 되죠. ( FROM 테이블1, 테이블2 )
그런데 이렇게 한다고 원하는 결과가 나올지는 모르겠네요.
원본 대비 결과표 예시자료를 보여주세요.


by 알수없음 [2019.06.21 09:13:56]

글 수정하였어요.


by 마농 [2019.06.21 09:32:06]

서로 연관이 없어보이는 자료 샘플 말구요.
간단하게라도 연관성이 보이는 자료로 해서
결과값도 원본으로부터 도출된 정확한 자료를 보여주셔야죠.

테이블 직접 캡쳐해서 보여달라는게 아니고
엑셀로 샘플자료 간단하게 타이핑해서 만들어서 보여달라는 거에요.

자료랑 상관 없는 기본적인 답변 드릴께요.
두 테이블을 연결하여 조회하려면 조인하면 됩니다.
두 테이블간의 연결관계를 나타내는 조인조건을 주면 되구요.
위에 제시하신 조건이 맞다면? 다음과 같은 쿼리가 됩니다.
다만, 조건이 맞는지 의심이 가긴 합니다.

SELECT *
  FROM 테이블1
     , 테이블2
 WHERE 테이블2.시작날짜 > 테이블1.시작날짜
   AND 테이블2.종료날짜 < 테이블1.종료날짜
;

 


by 알수없음 [2019.06.21 10:21:48]

테이블1

시:분 시:분
2:40 2:45
6:30 6:35
9:57 9:58
10:12 10:13
10:14 10:15
10:20 10:27
10:29 10:49
13:55 13:57
17:15 17:27
21:05 21:10

 

테이블2

시:분 시:분
0:00 0:50
1:00 2:30
3:10 5:50
6:00 7:50
7:50 9:50
10:00 11:30
12:10 14:50
15:00 18:50
19:00 21:00
21:15 22:50

 

결과값

6:30 6:35
10:12 10:13
10:14 10:15
10:20 10:27
10:29 10:49
17:15 17:27

 

이렇게 출력되기를 바랍니다.

샘플이 적절한지 모르겠네요.

테이블2의 한행(시작,종료) 마다 으로 테이블1의 모든 Row 를 필터하도록 하는게 목적입니다.

테이블1의 한행을 검사할때 테이블2의 하나의 행에라도 시간 범위가 속하면

출력 값에 나오고 하고자 합니다.


by 마농 [2019.06.21 11:09:32]
WITH t1 AS
(
SELECT 0 id, '02:40' sdt, '02:45' edt
UNION ALL SELECT 1, '06:30', '06:35'
UNION ALL SELECT 2, '09:57', '09:58'
UNION ALL SELECT 3, '10:12', '10:13'
UNION ALL SELECT 4, '10:14', '10:15'
UNION ALL SELECT 5, '10:20', '10:27'
UNION ALL SELECT 6, '10:29', '10:49'
UNION ALL SELECT 7, '13:55', '13:57'
UNION ALL SELECT 8, '17:15', '17:27'
UNION ALL SELECT 9, '21:05', '21:10'
)
, t2 AS
(
SELECT 0 id, '00:00' sdt, '00:50' edt
UNION ALL SELECT 1, '01:00', '02:30'
UNION ALL SELECT 2, '03:10', '05:50'
UNION ALL SELECT 3, '06:00', '07:50'
UNION ALL SELECT 4, '07:50', '09:50'
UNION ALL SELECT 5, '10:00', '11:30'
UNION ALL SELECT 6, '12:10', '14:50'
UNION ALL SELECT 7, '15:00', '18:50'
UNION ALL SELECT 8, '19:00', '21:00'
UNION ALL SELECT 9, '21:15', '22:50'
)
-- a 가 b 에 포함 --
SELECT *
  FROM t1 a
 INNER JOIN t2 b
    ON a.sdt > b.sdt
   AND a.edt < b.edt
;
-- a 가 b 를 포함 --
SELECT *
  FROM t1 a
 INNER JOIN t2 b
    ON a.sdt < b.sdt
   AND a.edt > b.edt
;
-- a 와 b 가 조금이라도 겹치면 포함 : 시작,종료 교차 비교 --
SELECT *
  FROM t1 a
 INNER JOIN t2 b
    ON a.sdt < b.edt
   AND a.edt > b.sdt
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입