2010-07-20 5 views
4

쓰려고하는 sqlite 쿼리가 있습니다.MySQL에서 가장 가까운 날짜에 테이블을 결합하십시오.

TableA의 (판매) : ID 판매 날짜

TableB의 (목표) : ID 목표 날짜

이 같은 TableA의에서 선택 해요 : SELECT 나는 두 개의 테이블이 id, sales, date from TableA

"까다로운 부분"이 있습니다. TableA에서 각 행에 대해 테이블에 의 목표 필드가 필요하기 때문에 쿼리에 TableB를 조인해야합니다. TableB는 일부 날짜의 목표 만 포함하고 TableA는 모든 날짜을 포함합니다. 그래서 TableA.date = TableB.date를 사용할 수 없습니다.

대신 TableA의 각 행에 대해 TableB의 목표를 TableA의 날짜와 가장 가까운 날짜로 가져 가야합니다. 희망을 설명 할 수 있었으면 좋겠다. 그것을하는 방법을 알아낼 수 없다 ..

답변

9
SELECT a.id, a.sales, a.date, (SELECT TOP 1 Goal 
           FROM TableB b WHERE b.date < a.date 
           ORDER BY b.date DESC) As Goal 
FROM TableA a 

과거 가장 가까운 날짜로 이동.

+0

이것은 좋은 일이지만 유일한 문제는 id를 테스트해야한다는 것입니다. –

1

"정확하게 동등한 날짜"는 날짜 필드의 조인이 될 것이다. (애쉬의 답변에서와 같이)

"가장 가까운 날짜"는 아마도 "가장 가까운 날짜"또는 "가장 가까운 날짜"와 같거나 그렇지 않을 수도 있습니다. 이 경우 날짜를 비교하는 WHERE 문을 사용하여 또는

"가장 가까운 날짜"가 과거와 현재 둘 다 있다면, 나는 아마 그것을 생성하는 저장 프로 시저를 작성하여 코드를 작성할 것입니다. 테이블 A의 모든 날짜에 가장 가까운 '가까운 날짜'(B부터)를 포함하는 도우미 테이블.이 방법을 사용하면 프로 시저의 동작을보다 잘 제어 할 수 있으며 향후 변경이 더 쉬울 것입니다.

나중에 성능을 최적화 할 수 있습니다.

+0

감사합니다. 나는 항상 가장 가까운 날짜이기 때문에 질문을 업데이트했다. 하지만 하위 쿼리를 작성하는 방법을 잘 모르겠습니다. – Martin

+0

크리스의 대답은 효과가 있습니까? – Tobiasopdenbrouw

0

데카르트 곱을 얻은 다음 관심없는 행을 필터링하십시오. 기본적으로 :

select a.*, b.* 
from a, b 
where 
not exists (
    select null 
    from b b2 
    where abs(b2.date - a.date) < abs(b.date - a.date) 
) 

SQLite가이를 지원하는지 모르겠다.

관련 문제