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)