2012-11-03 3 views
1

테이블에 중복 삽입을 피하는 방법은 무엇입니까?SQL 테이블에 중복 삽입을 피하는 방법

insert into RefundDetails(ID,StatusModified,RefundAmount,OrderNumber) 
    select O.id,O.StatusModified,OI.RefundAmount,O.OrderNumber 
    from Monsoon.dbo.[Order] as O 
    WITH (NOLOCK) JOIN Monsoon.dbo.OrderItem as OI 
    WITH (NOLOCK)on O.Id = OI.OrderId 
    WHERE o.ID in (SELECT OrderID 
       FROM Mon2QB.dbo.monQB_OrderActivityView 
       WHERE ACTIVITYTYPE = 4 AND at BETWEEN '10/30/2012' AND '11/3/2012') AND (O.StatusModified < '11/3/2012') 
+1

사용을 호출하려면 .. –

답변

0

은 당신이 사용하는 DB에 따라 달라집니다하지만 당신은 ROWNUM 맨 위의 행을 반환 <이 같은 뭔가를 찾고되지 않은 : 나는 테이블에 삽입하는 쿼리 아래에 사용할 수 있습니까?

1

새로운 항목이 이미 아니다 곳에 삽입하면 테이블이 이미 일부 값이 포함되어 있음을 우려하는 경우

insert into RefundDetails 
(ID,StatusModified,RefundAmount,OrderNumber) 
select distinct 
O.id 
,O.StatusModified 
,OI.RefundAmount 
,O.OrderNumber 
from Monsoon.dbo.[Order] as O WITH (NOLOCK) 
JOIN Monsoon.dbo.OrderItem as OI WITH (NOLOCK) 
    on O.Id = OI.OrderId 
WHERE o.ID in 
(
    SELECT OrderID 
    FROM Mon2QB.dbo.monQB_OrderActivityView 
    WHERE ACTIVITYTYPE = 4 
    AND at BETWEEN '10/30/2012' AND '11/3/2012' 
) 
AND O.StatusModified < '11/3/2012' 

또는 단지로 지정하여 select 문에서 중복을 제거하는 DISTINCT 키워드를 사용

insert into RefundDetails 
(ID,StatusModified,RefundAmount,OrderNumber) 
select distinct 
O.id 
,O.StatusModified 
,OI.RefundAmount 
,O.OrderNumber 
from Monsoon.dbo.[Order] as O WITH (NOLOCK) 
JOIN Monsoon.dbo.OrderItem as OI WITH (NOLOCK) 
    on O.Id = OI.OrderId 
WHERE o.ID in 
(
    SELECT OrderID 
    FROM Mon2QB.dbo.monQB_OrderActivityView 
    WHERE ACTIVITYTYPE = 4 
    AND at BETWEEN '10/30/2012' AND '11/3/2012' 
) 
AND O.StatusModified < '11/3/2012' 

--assuming we just need to check o.id to determine a duplicate: 
and O.id not in 
(
    select o.id 
    from RefundDetails 
) 

--alternatively, if the entire record counts as a duplicate 
and not exists 
(
    select top 1 1 
    from RefundDetails b 
    where O.id = b.id 
    and O.StatusModified = b.StatusModified 
    and OI.RefundAmount = b.RefundAmound 
    and O.OrderNumber = b.Order Number 

마지막으로 좀 더 고급 뭔가를하려는 경우 (즉, 당신이 새로운 주문을 삽입하고 기존 업데이트 할 수 있도록하기 위해), 당신은 SQL 또는 Oracle을 사용하는 경우, 당신은 MERGE 문이 있습니다 http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction-to-merge-statement-one-statement-for-insert-update-delete/

1

테이블에 값을 삽입하는 절차를 만들 수 있습니다.

create procedure p_insert_tablename 
columname datatype, 
coluname datatype 
begin 
if exists(select 1 from tblname where [give the condition on which you cols value you dont want the duplicate value]) 
/*if true then update the value by update query using the condition */ 
/*dont forget to give condition in update query*/ 

else 

/*insert the value*/ 
exit 

는 ** UNIQUE ** 절차

exec p_insert_tablename col1, col2,... 
0
To ignore (with a warning) attempts to insert duplicate keys rather than raising an error and having the whole statement fail you can use the IGNORE_DUP_KEY option. 

    CREATE TABLE RefundDetails 
    (
    ID INT NOT NULL PRIMARY KEY NONCLUSTERED WITH (IGNORE_DUP_KEY = ON), 
    ... 
    --your columns 
    ) 
관련 문제