Sql server 两个显示结果,其中包含来自不同数据库的两个表之间的差异

Sql server 两个显示结果,其中包含来自不同数据库的两个表之间的差异,sql-server,Sql Server,我有两个来自两个数据库的表,一个是本地的,另一个是服务器中的,所以需要找到两个表中的所有差异,这两个表都有表列,如图所示 我需要的结果如下图所示,那么他们还有其他方法可以找到吗 当我为下面的查询执行操作时,它正在加载,但无法生成结果;当我减少条件时,它正在生成结果,但我需要整个查询的正确结果 select DISTINCT tu.ModuleID, tu.AllowAdd, tu.AllowEdit, tu.AllowDelete, tu.All

我有两个来自两个数据库的表,一个是本地的,另一个是服务器中的,所以需要找到两个表中的所有差异,这两个表都有表列,如图所示

我需要的结果如下图所示,那么他们还有其他方法可以找到吗

当我为下面的查询执行操作时,它正在加载,但无法生成结果;当我减少条件时,它正在生成结果,但我需要整个查询的正确结果

select DISTINCT 
    tu.ModuleID, 
    tu.AllowAdd, 
    tu.AllowEdit, 
    tu.AllowDelete, 
    tu.AllowSupervision,
    tt.ModuleID,
    tt.AllowAdd,
    tt.AllowEdit,
    tt.AllowDelete,
    tt.AllowSupervision
from 
    t_UserModule tu,
    [smf5.0_check].dbo.t_usermodule tt
where 
    tu.ModuleID = tt.ModuleID
    and tu.OperatorID = tt.OperatorID
    and tu.AllowAdd <> tt.AllowAdd
    or tu.AllowEdit <> tt.AllowEdit
    or tu.AllowDelete <> tt.AllowDelete
    or tu.AllowSupervision <> tt.AllowSupervision
选择DISTINCT
杜鲁门,
杜·阿洛瓦德,
屠宰场允许它,
杜·阿洛德莱特,
你允许监督,
tt.ModuleID,
阿洛瓦德先生,
tt.AllowEdit,
tt.Allowdelite,
tt.AllowSupervision
从…起
t_用户模块tu,
[smf5.0_检查].dbo.t_用户模块tt
哪里
tu.ModuleID=tt.ModuleID
tu.OperatorID=tt.OperatorID
和tu.allowad tt.allowad
或者你,允许它,允许它
或者tu.allowdelett.AllowDelete
或者tu.AllowSupervision tt.AllowSupervision


如果存在可为空的列,则需要在连接条件中执行类似于
COALESCE(tu.allowad,-1)=COALESCE(tt.allowad,-1)
的操作问题在于
WHERE
子句。您需要对
OR
进行分组

WHERE
    tu.ModuleID = tt.ModuleID
    and tu.OperatorID = tt.OperatorID
    and (
        tu.AllowAdd <> tt.AllowAdd
        or tu.AllowEdit <> tt.AllowEdit
        or tu.AllowDelete <> tt.AllowDelete
        or tu.AllowSupervision <> tt.AllowSupervision
    )
在哪里
tu.ModuleID=tt.ModuleID
tu.OperatorID=tt.OperatorID
及(
图。阿洛瓦德tt。阿洛瓦德
或者你,允许它,允许它
或者tu.allowdelett.AllowDelete
或者tu.AllowSupervision tt.AllowSupervision
)
或者,您可以这样编写查询:

SELECT 
    tu.ModuleID, 
    tu.AllowAdd, 
    tu.AllowEdit, 
    tu.AllowDelete, 
    tu.AllowSupervision,
    tt.ModuleID,
    tt.AllowAdd,
    tt.AllowEdit,
    tt.AllowDelete,
    tt.AllowSupervision
FROM t_UserModule tu
INNER JOIN [smf5.0_check].dbo.t_usermodule tt
    ON tu.ModuleID = tt.ModuleID
    AND tu.OperatorID = tt.OperatorID
WHERE    
    tu.AllowAdd <> tt.AllowAdd
    OR tu.AllowEdit <> tt.AllowEdit
    OR tu.AllowDelete <> tt.AllowDelete
    OR tu.AllowSupervision <> tt.AllowSupervision
选择
杜鲁门,
杜·阿洛瓦德,
屠宰场允许它,
杜·阿洛德莱特,
你允许监督,
tt.ModuleID,
阿洛瓦德先生,
tt.AllowEdit,
tt.Allowdelite,
tt.AllowSupervision
来自t_usertu模块
内部联接[smf5.0_检查].dbo.t_用户模块tt
关于tu.ModuleID=tt.ModuleID
tu.OperatorID=tt.OperatorID
哪里
图。阿洛瓦德tt。阿洛瓦德
或者你,允许它,允许它
或者tu.allowdelett.AllowDelete
或者tu.AllowSupervision tt.AllowSupervision

编辑:我知道我的旧答案存在一些性能问题。下面是一个可以处理空值的新答案:

SELECT
    t1.ModuleID, 
    t1.AllowAdd, 
    t1.AllowEdit, 
    t1.AllowDelete, 
    t1.AllowSupervision,
    t2.ModuleID,
    t2.AllowAdd,
    t2.AllowEdit,
    t2.AllowDelete,
    t2.AllowSupervision
FROM
    t_UserModule t1
JOIN 
    [smf5.0_check].dbo.t_usermodule t2
ON
    t1.ModuleID = t1.ModuleID and
    t2.OperatorID = t2.OperatorID
WHERE not exists
  (SELECT
     t1.AllowAdd, 
     t1.AllowEdit,
     t1.AllowDelete,
     t1.AllowSupervision
   INTERSECT
   SELECT
     t2.AllowAdd, 
     t2.AllowEdit,
     t2.AllowDelete,
     t2.AllowSupervision)

如果两个表中只有ModuleID和OperatorId,则此查询将返回记录。如果有ModuleID+OperatorID的记录只存在于1个表中,那么它将在union的第一部分中不返回将t1别名更改为t2的内容。不管怎样,既然可以使用完全联接,为什么还要做这么复杂的事情呢?@sidux,因为完全联接不会像问题要求的那样显示两个表中的数据。@t-clausen.dk:谢谢你的信息,我对你的代码有点困惑,我对sql非常基础。您使用的是t2.Allow id,但没有从哪个表中提及,因此显示了错误。@t-clausen.dk:您可以查看您的查询吗?在第一次查询中,他正在从两个表a+b中生成一行。在第二行中,他为b+a添加行。在最后一个查询中,他删除了a+b a+a或b+aa+a的所有查询。这意味着所有记录都必须匹配。如果任何列包含空值,表将包含多少行?@t-clausen.dk:没有空列。生成的结果包含400行结果。在这种情况下,@wewesthemenance的答案应该满足您的需要。别忘了接受答案。@t-clausen.dk:你说的“别忘了接受答案”是什么意思?我说查询执行谢谢你的信息。分数旁边有一个小复选框
SELECT
    t1.ModuleID, 
    t1.AllowAdd, 
    t1.AllowEdit, 
    t1.AllowDelete, 
    t1.AllowSupervision,
    t2.ModuleID,
    t2.AllowAdd,
    t2.AllowEdit,
    t2.AllowDelete,
    t2.AllowSupervision
FROM
    t_UserModule t1
JOIN 
    [smf5.0_check].dbo.t_usermodule t2
ON
    t1.ModuleID = t1.ModuleID and
    t2.OperatorID = t2.OperatorID
WHERE not exists
  (SELECT
     t1.AllowAdd, 
     t1.AllowEdit,
     t1.AllowDelete,
     t1.AllowSupervision
   INTERSECT
   SELECT
     t2.AllowAdd, 
     t2.AllowEdit,
     t2.AllowDelete,
     t2.AllowSupervision)