2013-04-15 2 views
0

나는 예를 들어 이러한 날짜가 :SQL Server에서 다중 선택과 데이터를 비교하는 방법은 무엇입니까?

date1: 2013-01-01 
date2: 2013-01-25 

내가 date1이 두 날짜 사이 인 경우 데이터베이스에 제품 특별 제공을 삽입하는 프로 시저를 작성해야합니다.

create procedure CreateOfferProduct(
@codP varchar(5), 
@date1 date, 
@date2 date, 
) 
as 
if(not exists(
     select * from OfferProducts 
      where Products.codP = @codP 
      and @date1 <= (select date2 from OfferProducts where codP = @codP) 
    ) 
) 
begin 
     insert into OfferProducts(codP, date1, date2) 
     values(@codP, @date1, @date2); 
end 

그러나

select date2 from Products where codP = @codP 

가 작동하지 않는 여러 값을 반환

이후

. 어떤 도움을 주셔서 감사합니다.

+1

"MAX (date2) 선택"또는 "MIN (date2)"을 선택하면 비즈니스 로직에 적합한가요? – Melanie

+0

'codP' 열은 정확히 무엇을 나타내는가? 이것은 제품의 식별자입니까? 그렇다면 여러 값을 반환하는 이유는 무엇입니까? –

+0

문제는 이보다 복잡하므로 가능한 한 간단하게 질문을 다시 작성하려고했습니다. 본질적으로 데이터베이스 (이미)에 저장되어있는 제품에 대한 오퍼가 아직 없으면 해당 스토어에 대한 ProductOffer를 삽입하는 절차를 찾고있었습니다. 죄송합니다. 제 질문이 혼란 스럽다면. – Mythul

답변

1

두 기간의 교차점을 찾고 있습니다. 원하는 내용은 다음과 같습니다.

. . . 
if not exists (
    select * 
    from OfferProducts op 
    where op.codP = @codP and 
      (op.date1 <= @date2 and 
      op.date2 >= @date1) 
) 
    . . . 

정확히 일치하는 정의는 끝점이 날짜 범위에 포함되는지 여부에 따라 달라집니다.

질문을 다시 읽으면 "해당 날짜 1이 (가)이 두 날짜 사이에 있음"이라고 명시 적으로 지정합니다. 그렇다면 다음을 시도해보십시오.

if not exists (
    select * 
    from OfferProducts op 
    where op.codP = @codP and 
      op.date1 between @date1 and @date2 
) 
    . . . 
+0

그러나 OP는 여러 행을 삽입하려고하기 때문에 'IF'조건부로 작동하지 않으며 이미 존재하지 않는 조건부 행을 삽입합니다. –

+0

@AaronBertrand. . . 질문에 여러 삽입에 대해서는 아무것도 볼 수 없습니다. –

+1

OP는'~ ... 여러 값을 반환합니다. '- 즉, @codP의 값과 일치하는 여러 제품이 있고 여러 행을 삽입해야 함을 의미합니다. –

4

변수에 값을 할당하는이 행 단위 기법 대신에 대상에 아직 존재하지 않는 여러 행을 삽입하는 방법 중 하나입니다 (느리고 유연하지 않음).

INSERT dbo.OfferProducts(codP, date1, date2) 
    SELECT p.codP, @date, @date2 
    FROM dbo.Products AS p 
    WHERE codP = @codP 
    AND NOT EXISTS 
    (
    SELECT 1 FROM dbo.OfferProducts 
     WHERE codP = p.codP 
     AND date2 >= @date1 -- this logic seems funny 
); 

당신은 샘플 데이터 및 삽입에서 제외하려는 기존의 데이터를 포함하여 원하는 결과를 표시하는 경우, 우리는 당신을 위해 더 나은 논리를 공식화 할 수 있습니다.

+0

예를 들어 주셔서 감사합니다. – Mythul

관련 문제