2014-01-21 8 views
3

모두 나는이 문제에 접근하는 가장 좋은 방법을 찾기 위해 노력하고 있습니다. 본질적으로 두 개의 테이블을 비교하고 "OrderComplete"라는 열이 "예"이거나 레코드가 현재 삽입 테이블에없는 경우와 같이 특정 조건이 충족되면 기존 레코드의 복제본을 삽입하려고합니다. IF 문이나 CASE를 사용하려고했지만 IF 부분이 붙어 있습니다. 아래는 IF 문을 작성하는 데 필요한 두 가지 쿼리입니다. 어떤 생각이나 생각?SQL 쿼리 문제를 사용하여/case 문을 사용하는 경우

두 쿼리 모두 아래에서 잘 작동하지만 중복 항목을 찾고 삽입 테이블의 항목 "OrderComplete"가 yes로 설정된 경우에만 복사본이 필요합니다. 간단한 방정식을 넣을 수 있지만 IF 영역에 SELECT 또는 좀 더 복잡한 것을 삽입하고 싶습니다. 그리고 IF 문에서 두 테이블을 비교할 수는 없지만 지금 당황한 것입니다.

IF ????? 
BEGIN 
use [PaperDB] 
INSERT INTO dbo.ORDERED_PARTS_TABLE 
     ([OrderPN] 
     ,[OldPN] 
     ,[OldPN2] 
     ,[PartDescription] 
     ,[WhereUsed] 
     ,[LocationStored] 
     ,[LocationDescription] 
     ,[AlternateLocationStored] 
     ,[AlternateLocationDescription] 
     ,[QuantityOnHand] 
     ,[ReorderQuantity] 
     ,[QuantityToOrder] 
     ,[Category] 
     ,[LastUpdated] 
     ,[spare] 
     ,[spare2] 
     ,[spare3]) 
SELECT s.orderpn, s.oldpn, s.oldpn2, s.partdescription, s.whereused, s.locationstored,   
s.locationdescription, s.alternatelocationstored, s.alternatelocationdescription,  
s.quantityonhand, s.reorderquantity, s.reorderquantity - s.QuantityOnHand , s.category,  
s.lastupdated, s.QuantityOnHand , s.ReorderQuantity , s.Spare3 
FROM dbo.PARTS_ORDER_TABLE as s 
LEFT OUTER JOIN 
ORDERED_PARTS_TABLE as t 
on s.OrderPN = t.OrderPN 
WHERE (NOT EXISTS (SELECT * 
      from ORDERED_PARTS_TABLE 
      where s.OrderPN = t.OrderPN)) 
END 
ELSE 
BEGIN 
use [PaperDB] 
INSERT INTO dbo.ORDERED_PARTS_TABLE 
([OrderPN] 
     ,[OldPN] 
     ,[OldPN2] 
     ,[PartDescription] 
     ,[WhereUsed] 
     ,[LocationStored] 
     ,[LocationDescription] 
     ,[AlternateLocationStored] 
     ,[AlternateLocationDescription] 
     ,[QuantityOnHand] 
     ,[ReorderQuantity] 
     ,[QuantityToOrder] 
     ,[Category] 
     ,[LastUpdated] 
     ,[spare] 
     ,[spare2] 
     ,[spare3]) 
SELECT s.orderpn, s.oldpn, s.oldpn2, s.partdescription, s.whereused, s.locationstored, 
s.locationdescription, s.alternatelocationstored, s.alternatelocationdescription, 
s.quantityonhand, s.reorderquantity, s.reorderquantity - s.QuantityOnHand , s.category, 
s.lastupdated, s.QuantityOnHand , s.ReorderQuantity , s.Spare3 
FROM dbo.PARTS_ORDER_TABLE as s 
LEFT OUTER JOIN 
ORDERED_PARTS_TABLE as t 
on s.OrderPN = t.OrderPN 
WHERE s.OrderPN = t.OrderPN AND t.OrderComplete = 'yes' 
END 
+0

구문이 SQL Server처럼 보이기 때문에 sql-server 태그를 추가했습니다. –

+0

한가지 말하자면,'if' 전에'use' 문을 움직이십시오. 둘 다. –

+0

SQL Server를 사용하고 있다면 어떤 버전이 될 수 있습니까? – JodyT

답변

0

귀하의 모든 문제를 이해하지만 귀하가 필요한 것을 성취하기 위해 IF를 사용할 수는 없습니까?

IF EXISTS (SELECT * FROM dbo.ORDERED_PARTS_TABLE WHERE whatever='??') THEN 
0

나는 MERGE 기능을 사용하는 것이 좋습니다 것입니다.

일치하는 기준을 설정하고 단일 세트 기반 작업의 일부로 업데이트/삽입/삭제를 수행 할 수 있습니다. 여기 실행할 수 있습니다

아주 좋은 예 :

http://www.cs.utexas.edu/~cannata/dbms/SQL%20Merge.html

0

또 다른 방법은 두 테이블에서 선택을 수행 할 수 있습니다.

Insert into TableC(
    Col1, 
    Col2 
) 
Select 
    a.Col1, 
    a.Col2 
From TableA a 
join TableB b on b.ID = a.ID 
       --expand this to express the full relationship between the tables. 
where a.OrderComplete = 'yes' -- This will give you rows where OrderComplete = Yes 
or b.ID is null -- This will add also return results where TableB is missing rows. 

결국 TableC에 모든 것이 삽입됩니다.