2009-10-07 31 views
0

我有表A.這個表沒有任何PK,它只是存儲大量的行,只能通過組合列值來識別。 有一個程序從表A中取數據,從其他表中進行適當的匹配/處理並提供表B. 現在,如何檢查表A中的數據是否正確插入到表B中?
這是sql server 2000所以EXCEPT不是一個解決方案。在t-sql(sql server2000)的另一個表中搜索數據?

也許一些過程,將包括:

  1. 光標將取從 表A中的行,
  2. 做第B選擇(與適當的 列匹配)
  3. ,然後,如果匹配的行已 找到(選擇返回一些數據) 增加計數器(正確數量 傳播行)
  4. 如果找不到匹配的行將 數據,我們正在尋找到 臨時表(供日後查看)

更新: 過程,飼料表B中並沒有把所有的行從表一表進C.此外還從其他表中獲取數據(我們稱之爲C)並將其放入B(但不是所有行)。我認爲可能使用一個遊標來檢查B的A數據,然後使用其他遊標來檢查B的C數據將是一個很好的解決方案。

+0

更新後:雖然我不排除有些情況需要使用遊標,但這些情況很少見,而且這當然不是其中之一。必須有一些標準可以讓你知道爲什麼A中的行確實或沒有達到B.你可以修改下面的答案中的任何一個來確定哪些行應該在B中但是沒有實現它。 –

+0

爲什麼你沒有在每張桌子上PK?如果你有組合鍵,你至少應該有一個代理PK和一個定義記錄的值組合的唯一索引。如果表A僅僅是一個臨時表,並且只用於在移動到表b之前存儲清理數據,那麼也許你可以在沒有唯一索引的情況下離開(也許你還沒有清理數據以使其唯一),但是我甚至在這些表上也放了一張PK,因爲它能夠唯一地識別一條記錄是非常有用的。 – HLGEM

+0

表A和C是數據庫中其他表格彙總的表格。表B是用於生成報告的視圖的基表。這就是它的設計,而不是我的決定,我無法改變它。我只需要與它鬥爭。 – yoosiba

回答

0

您可以不按照你的標準有一個匹配行做了NOT EXISTS

SELECT Columns 
FROM TableA 
Where NOT EXISTS 
(
SELECT 1 
FROM TableB 
WHERE 1=1 
AND TableA.Column1 = TableB.Column1 
AND TableA.Column2 = TableB.Column2 
AND TableA.Column3 = TableB.Column3 
AND TableA.Column4 = TableB.Column4 
) 

您可以有根據您的標準匹配,但不具備的,其餘的行做查詢數據匹配

SELECT Columns 
FROM TableA 
INNER JOIN TableB 
    ON TableA.Column1 = TableB.Column1 
    AND TableA.Column2 = TableB.Column2 
    AND TableA.Column3 = TableB.Column3 
    AND TableA.Column4 = TableB.Column4 
) 
WHERE TableA.Column11 <> TableB.Column11 
OR TableA.Column12 <> TableB.Column12 
OR TableA.Column13 <> TableB.Column13 
OR TableA.Column14 <> TableB.Column14 

既然您有兩組斷開連接的記錄,則可以應用必要的邏輯。

這裏的大多數人會給你基於SET的答案,而不是基於CURSOR的答案。你會在StackOverflow上找到很多關於爲什麼不使用CURSOR的資料。

0

爲什麼你需要光標?

SELECT COUNT(*) --or simply the list of columns 
FROM A LEFT JOIN B 
      ON A.col1 = B.col1 
      AND A.col2 = B.Col2 
      AND .... 
WHERE A.col1 IS NULL AND A.col2 IS NULL 

您可能需要在WHERE子句中指定幾個列來檢查NULL是否存在其中幾個列可能爲NULL的可能性。

這可能不是很快,所以根據您的索引結構,您可能需要首先檢查計數,看看是否有任何不匹配的行,然後搜索行。

相關問題