스토어드 프로 시저에서 SQL Server를 반복하는 것이 좋지 않은 방법에 대한 몇 가지 게시물이 있습니다. 그러나 나는 내가하려고하는 것을 찾지 못했습니다. 우리는 내부적으로 직접 엑셀에 연결할 수있는 데이터 연결을 사용하고 있습니다.SQL Server의 루프에 대한 집합 기반 대안
몇 사람이 대부분의 루프를 표준 쿼리로 변환 할 수 있다고 말한 게시물을 보았습니다. 그러나 나에게있어서 나는이 문제에 곤경을 겪고있다.
유형 38,40의 이벤트 직전에 주문한 모든 custID
이 필요합니다. 첫 번째 쿼리에서 이벤트와 주문 사이에 다른 순서가없는 경우에만 가져 오기만하면됩니다.
3 부분으로 구성되어 있습니다. 먼저 임시 테이블에 시간 프레임을 기반으로 모든 주문 (주문 테이블)을 쿼리합니다. 내부는 현재 주문 과거 이전에 시간이 발생할 수있는 고객 이벤트 (LOGEVENT 테이블)을 얻을 수있는 보조 테이블 조인에
Select into temp1 odate, custId from orders where odate>'5/1/12'
는 다음 나는 임시 테이블을 사용할 수 있습니다. 여기
Select into temp2 eventdate, temp1.custID from LogEvent inner join temp1 on
temp1.custID=LogEvent.custID where EventType in (38,40) and temp1.odate>eventdate
order by eventdate desc
문제는 그 나는 각 고객에 대한 최신 할 첫 번째 쿼리에서 각 고객에 대한 모든 행을 반환합니다 실행하려고하고 쿼리. 그래서 이것은 클라이언트 측에서 모든 이전 이벤트 대신 하나의 이벤트 만 얻도록 반복합니다. 그러나 모든 쿼리가 Excel 내부에서 실행되어야하므로 클라이언트 측을 루프 할 수는 없습니다.
세 번째 단계에서는 두 번째 쿼리의 결과를 사용하여 가장 최근의 주문과 이전 주문간에 이벤트가 발생했는지 확인합니다. 나는 이벤트가 순서를 앞서는 데이터와 그 사이의 다른 명령을 원한다.
Select ordernum, shopcart.custID from shopcart right outer join temp2 on
shopcart.custID=temp2.custID where shopcart.odate >= temp2.eventdate and
ordernum is null
이를 단순화하고 그것이 SQL 서버 대신 내가 클라이언트에서 수행입니다 루프의 일종에서 실행 기반 세트를 만들 수있는 방법이 있나요?
어떤 버전의 sql-server? –
저는 2005 년과 2008 년을 사용하고 있습니다. 2008 년까지 마이그레이션을 시작했지만 끝나지 않았으므로 2005 년에도이를 해결해야합니다. – CaptainBli
5 월 1 일 또는 1 월 5 일입니까? 날짜 리터럴에 대해 안전하고 분명한 형식을 사용하십시오. ' '20120501 '' ... SQL Server는이 정보를 오해하지 않으며 사용자, 동료 또는 독자도 오해하지 않습니다. –