2014-05-16 2 views
0

SQL DB (2008 R2)에서 업데이트하려고하지만 어떤 이유로 업데이트가 예상보다 많이 발생합니다. 내 위치, 가입 및 업데이트 명령에 문제가 있다고 생각하지만 범위와 조작 순서에 대한 정보를 찾는 데 문제가 있습니다. 다행히도 프로덕션에서 변경하기 전에 복원되는 DB 백업을 연습하고 있습니다!예상보다 많은 SQL 업데이트 명령이 발생했습니다.

비슷한 결과 (가입 및 업데이트) 인 this 링크를 찾았지만, 제 경우에는 적용하기가 어렵습니다.

testUnitCount가 15578 인 경우 unitNo를 05101에서 05088로 변경하려고합니다. 어떤 이유로이 값은이 TestNumber에 대한 모든 UnitNo를 이동시킵니다. OLAP DB (Cubes)이기 때문에 모든 테이블에서 사람들이 익숙하지 않은 것보다 더 복잡해 보일 수 있습니다.

SELECT  DashboardData.TestNumber, TestUnits.unitNo, TestUnitCounts.testUnitCount 
FROM   DashboardData INNER JOIN 
         TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
         MeasurementData ON TestUnitCounts.testUnitCountID = MeasurementData.TestUnitCountID INNER JOIN 
         TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID AND 
         MeasurementData.TestUnitID = TestUnits.testUnitID 
         where unitNo='05101' 
         AND TestNumber='1024' 
         AND TestUnitCounts.testUnitCount='15578' 
         order by testUnitCount asc 
         UPDATE TestUnits 
         SET unitNo='05088' where unitNo='05101' 

사람이 명령이 그래서 난 그냥 테스트 1024 unitNo 05101-> 05088에 대한 15578의 testUnitCount을 변경하는 변경해야합니다 알고 있나요

: 나는이 시간을 명령 올바른 줄 알았는데? 왜 그 모든 TestNumber를 변경합니까?

여기 내 CTE 시도가 똑같습니다.

Use OLAP05132014C 
GO 


WITH QueryName_CTE (unitNo,TestNumber,testUnitCount) 
AS 
(
SELECT  DashboardData.TestNumber, TestUnits.unitNo, TestUnitCounts.testUnitCount 
FROM   DashboardData INNER JOIN 
         TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
         MeasurementData ON TestUnitCounts.testUnitCountID = MeasurementData.TestUnitCountID INNER JOIN 
         TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID AND 
         MeasurementData.TestUnitID = TestUnits.testUnitID 
         where unitNo='05101' 
         AND TestNumber='1024' 
         AND TestUnitCounts.testUnitCount='15578' 
) 
Update QueryName_CTE 


         SET unitNo='05088' where unitNo='05101' 
+4

선택과 관련된 행만 업데이트하려고합니까? 그것이 위에있는 방식으로, 그것들은 서로 다른 두 가지 진술 ..... ..... 서로 관련이 없습니다. CTE를 검색하여 작은 그룹의 항목을 업데이트 할 수 있습니다. – granadaCoder

+0

예, 선택 영역의 행만 업데이트하려고합니다. 나는 CTE를 찾는 것에 대해 들어 본 적이 없다. 무슨 소리 야? – Michele

+0

CTE 접근 방식 인 답변을 추가했습니다. – granadaCoder

답변

0

에 무슨 일이 일어나고 있는지 디버깅 우리가 일을 끝내고 나서 이걸 업데이트하겠다고 생각 했어. 동료는 다른 접근 방식을 사용했는데 왜 문제에 대해 주어진 매개 변수로 (직접적으로) 작동하지 않았는 지 정확히 알지 못하고 다른 값을 사용해야했지만 이것이 바로이 문제를 해결했습니다 .참여 모양이 같은

그래서

테이블 :

PQdata table name ---------DashboardData table name----------TestUnits table name 
key pqID     key pqID       key testUnitID 
TestIndex     TestIndex       unitNo 
          TestNumber       | 
          TestUnitID       | 
           |        | 
          TestUnitCounts table name------------ 
          key testUnitCountID 
          testUnitID 
          testUnitCount 
난 다시 가서 자신의 쿼리를 기반으로 그것을 문서화

:

SELECT  PQdata.pqID, PQdata.TestIndex, TestUnits.unitNo, TestUnits.testUnitID, DashboardData.TestNumber, TestUnitCounts.testUnitCount 
FROM   DashboardData INNER JOIN 
         TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
         TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID INNER JOIN 
         PQdata ON DashboardData.pqID = PQdata.pqID 
         where TestNumber='1024' 
         AND unitNo='05101' 
         AND testUnitCount='15578' 

: 그는 먼저 볼 필요 •

• 이것은 TestNumber에 해당하는 pqid를 제공했습니다. 10204

• 그런 다음 그는 지느러미를해야했습니다. unitNo에 대한 개발 testUnitID 05088 : 2971

•를 플러스 그는 유사 원래 testUnitID 찾아야했다 : 따라서 • 2970

,이 같은 업데이트를 필요로 모양을 따라서 testUnitID로 변경해야 •

SELECT  PQdata.pqID, PQdata.TestIndex, TestUnits.unitNo, TestUnits.testUnitID, DashboardData.TestNumber, TestUnitCounts.testUnitCount 
FROM   DashboardData INNER JOIN 
         TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
         TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID INNER JOIN 
         PQdata ON DashboardData.pqID = PQdata.pqID 
         where TestNumber='1024' 
         AND unitNo='05088' 

:

UPDATE DashboardData SET testUnitID = 2971 WHERE testUnitID = 2970 AND pqID = 10204 

내가 (내 작동하지 않았다) 시도했던 것보다 더 라운드에 대한 접근 방식이었다.

1

위의 설명에서와 같이 현재 업데이트가 별도로 실행 중입니다. 선택 항목 대신 쿼리를 업데이트로 변경하십시오. 쿼리가 될

변경 - 여기

UPDATE TestUnits 
    SET TestUnits.unitNo = '05088' 
    FROM   DashboardData INNER JOIN 
          TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
          MeasurementData ON TestUnitCounts.testUnitCountID = MeasurementData.TestUnitCountID INNER JOIN 
          TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID AND 
          MeasurementData.TestUnitID = TestUnits.testUnitID 
          where unitNo='05101' 
          AND TestNumber='1024' 
          AND TestUnitCounts.testUnitCount='15578' 
          order by testUnitCount asc 
+0

첫 줄에 구문이 마음에 들지 않습니다. 개체 이름이 잘못되었습니다. 그것은 그 테이블에 있습니다. – Michele

+1

위의 금요일 오후 수정에서 편집하십시오 ... – user1948635

+0

testUnitCount가 '5'이고 '15578'인 경우 UnitNo가 변경된 것 같습니다. 여전히 같은 문제가 있습니다. 백업 복원 시간! 다음 시도해보십시오 ... – Michele

1

는 Northwind를 CTE의 예입니다.

나는 이것이 당신이하려는 일이라고 생각합니다. (전체 테이블이 아닌 선택 쿼리에있는 행을 업데이트)

다음은 SQL Server 2008 R2의 MSDN 링크입니다. 여기

http://technet.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx

는 .... 예제 코드입니다

Use Northwind 
GO 


Declare @CustomerID char(5) 
Select @CustomerID = 'VINET' 

print 'Pre Look' 
Select o.CustomerID , o.ShipVia 
    FROM 
     dbo.Orders o where o.CustomerID = @CustomerID 

/* Now the CTE. The CTE gets a result based on the specific customerid */ 

;WITH cteOrdersForOneCustomer (OrderID,CustomerID,EmployeeID,OrderDate,RequiredDate,ShippedDate,ShipVia,Freight,ShipName,ShipAddress,ShipCity,ShipRegion,ShipPostalCode,ShipCountry) 
AS 
(
    SELECT o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate,o.RequiredDate,o.ShippedDate,o.ShipVia ,o.Freight,o.ShipName,o.ShipAddress,o.ShipCity,o.ShipRegion,o.ShipPostalCode,o.ShipCountry 
    FROM 
     dbo.Orders o where o.CustomerID = @CustomerID 
) 

/* Now I update the rows in the CTE, not the entire table */ 
Update cteOrdersForOneCustomer 
    Set ShipVia = 1 where ShipVia = 3 


print 'Post Look' 
Select o.CustomerID , o.ShipVia 
    FROM 
     dbo.Orders o where o.CustomerID = @CustomerID 

APPEND :

사용이 전술 CTE에

declare @CurrentRowCount int 


WITH QueryName_CTE (unitNo,TestNumber,testUnitCount) 
AS 
(
SELECT  DashboardData.TestNumber, TestUnits.unitNo, TestUnitCounts.testUnitCount 
FROM   DashboardData INNER JOIN 
         TestUnitCounts ON DashboardData.TestUnitCountID = TestUnitCounts.testUnitCountID INNER JOIN 
         MeasurementData ON TestUnitCounts.testUnitCountID = MeasurementData.TestUnitCountID INNER JOIN 
         TestUnits ON DashboardData.TestUnitID = TestUnits.testUnitID AND TestUnitCounts.testUnitID = TestUnits.testUnitID AND 
         MeasurementData.TestUnitID = TestUnits.testUnitID 
         where unitNo='05101' 
         AND TestNumber='1024' 
         AND TestUnitCounts.testUnitCount='15578' 
) 

--Debug Level 1, see if anything is in that table 
Select * from QueryName_CTE 

/* 
--Debug Level 2, see if what you're looking for is in that table 
Select * from QueryName_CTE where unitNo='05101' 
*/ 

/* 
--After debug 1 and 2....do the update 
Update QueryName_CTE 
    SET unitNo='05088' where unitNo='05101' 
*/ 

Select @CurrentRowCount = @@ROWCOUNT 

print 'Row Count After "Debug Level 2" or "After debug 1 and 2....do the update"' 
print @CurrentRowCount 
print '' 
+0

여기에 우리 의견에 무슨 일이 일어 났는지 확실하지 않습니다. – Michele

+1

나도 마찬가지다. 나는 "토론에 이것을 가져 가라"고 말할 때, 우리는 귀를 기울여야했습니다. – granadaCoder

관련 문제