2016-12-05 1 views
0

일부 기준에 따라 테이블을 업데이트 중입니다. 해당 기준에 사용할 수있는 행이있을 때만 테이블을 업데이트해야합니다.ONLY 행이 있고 업데이트 된 것을 표시 할 때 테이블을 업데이트하십시오.

IF EXIST (SELECT COUNT(*) FROM TableA INNER JOIN TableB 
ON TableA.Product_ID = TableB.ProductID 
WHERE TableA.ProductID = 143) 

BEGIN 

UPDATE TableA 
SET A.ProductID = 123 
FROM TableA INNER JOIN TableB ON TableA.ProductID = Table.ProductID 
WHERE TableA.ProductID = 143 

END 

문제 : 다음은 내 코드의 예입니다 테이블의 데이터를 업데이트하지만 모든 것을에게 난 단지 기록이있는 경우 업데이트하는 대신 실행할 때마다 업데이트 할 것 같다. 예를 들어 위의 쿼리를 실행하면 (10 row(s) affected) 메시지가 나타납니다. 다시 실행하면 (0 row(s) affected)을 얻습니다. 테이블이 이미 업데이트되어 IF 문이 결과를 가져 오지 않아야하기 때문입니다.

은 나뿐만 아니라 다음과 같은 옵션을 시도 :

IF (SELECT COUNT(*) FROM TableA INNER JOIN TableB 
ON TableA.Product_ID = TableB.ProductID 
WHERE TableA.ProductID = 143) >0 

BEGIN 

UPDATE TableA 
SET A.ProductID = 123 
FROM TableA INNER JOIN TableB ON TableA.ProductID = Table.ProductID 
WHERE TableA.ProductID = 143 

END 

문제 : 위의 쿼리는 Command(s) completed successfully를 반환합니다. 결과적으로 업데이트되는 행 수가 필요합니다. 어떻게해야합니까?

+0

ProductID = 123 인 TableB에는 행이 있습니까? – DVT

+1

@@ ROWCOUNT는 (는) 찾고 계신 것으로 보입니다.하지만 첫 번째 명령의 두 번째 실행에서 아무 것도 업데이트하지 않기를 기대하는 이유를 모르겠습니다. – scsimon

+0

방금 ​​실행하면 어떻게됩니까? "업데이트 A SET ProductID = 123 테이블에서 A 내부 조인 테이블 B B A. A.ProductID = B.ProductID 및 B.ProductID <> 123; " – DVT

답변

0

내가 정확히 원하는 것을 추측하면이 방법은 덜 복잡한 방식 일 것입니다.

IF EXISTS (SELECT * FROM TableB WHERE ProductID = 143) 
BEGIN 
UPDATE TableA 
SET ProductID = 123 
WHERE ProductID = 143; 

SELECT @@ROWCOUNT; 
END; 
0

문제는 COUNT(*)입니다. 행이 없어도 0을 반환합니다. 실제로는 (항상)입니다. 너는 *으로 바꾸면됩니다.

EXISTS때문에 SQL Server의 옵티마이 저는 첫 번째 레코드에서 멈추게됩니다 (잠재적으로 두 가지를 더 빠르게 만들 수 있습니다.).

옵티마이 저는 EXISTS 때문에 *을 확장하지 않아도됩니다.

IF EXISTS (SELECT * 
      FROM TableA 
     INNER JOIN TableB ON TableA.Product_ID = TableB.ProductID 
      WHERE TableA.ProductID = 143 
     ) 
BEGIN 

    <your update statement>; 

    SELECT @@rowcount; -- or "RETURN @@rowcount;" whatever is appropriate to your use case 

END 
관련 문제