2016-11-25 107 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条款。