2016-11-25 226 views
2

我有兩個相同的表,但駐留在不同的服務器上。一張桌子缺少我已驗證的一行。我試圖通過除SQL Server中的SQL語句不返回預期的結果

SELECT GUID FROM dbo.tableA 
EXCEPT 
SELECT GUID FROM [Server2].MyDatabase.dbo.tableA 

或其他方式對這些表進行比較,發現了丟失記錄

各地

SELECT GUID FROM [Server2].MyDatabase.dbo.tableA 
EXCEPT 
SELECT GUID FROM dbo.tableA 

兩個查詢返回結果爲零。我在兩張桌上都使用了select count(*),並且計數不同

我在做什麼錯?

感謝您的任何反饋提前

回答

4

計數可以是不同的,它仍然是可能的except返回零行。怎麼樣?如果一個或兩個表中有重複。

這裏是一個修改,可以幫助你找到的差異:

SELECT GUID, ROW_NUMBER() OVER (PARTITION BY GUID ORDER BY GUID) as seqnum 
FROM dbo.tableA 
EXCEPT 
SELECT GUID, ROW_NUMBER() OVER (PARTITION BY GUID ORDER BY GUID) as seqnum 
FROM [Server2].MyDatabase.dbo.tableA 
+0

這工作得很好,速度非常快 –

0

以我的經驗與鏈接服務器工作時如預期EXCEPT操作不起作用。爲什麼?我不知道。

作爲一種變通方法我插入從遠程服務器中的行到本地臨時表,然後可以比較:(I也本地一個複製到第二臨時表出於其它原因)

Select GUID 
    Into #Server2_tblA 
    From [Server2].MyDatabase.dbo.tableA; 

Select GUID 
    Into #Local_tblA 
    From dbo.tableA; 

Select GUID From #Server2_tblA 
Except 
Select GUID From #Local_tblA; 
... 
0

表A值在MyDatabase.dbo.tableA.Using不提出不存在caluse爲得到這樣的結果

SELECT GUID 
FROM dbo.tableA WHERE NOT EXISTS(SELECT 1 
           FROM [Server2].MyDatabase.dbo.tableA 
           WHERE GUID = [Server2].MyDatabase.dbo.tableA.GUID) 
+0

雖然這可能是一個有效的答案,但你更可能通過解釋代碼的作用和工作原理來幫助他人。僅有代碼的答案往往會得到較少的積極關注,並沒有其他答案那麼有用。 – Aurora0001

0

當你設置這取決於訂單,它是基於集合理論。

  • 2,3,4不具有(=除外)3 - >使用的值2設定4
  • 3無2,3,4 - >這意味着空集
  • 3,3, 4無1,2,3(這是你的情況下) - >它裝置設定與只有一個值4

除裝置過濾來自第一組,其中,值包含在第二集合中的任何一行。您的查詢返回相同的輸出,因爲您的表中存在重複的行(具有相同的值)。

請勿使用except/intersect - 請使用exists,injoin條款。