Sql 比较两个表,查找缺少的行和不匹配的数据

Sql 比较两个表,查找缺少的行和不匹配的数据,sql,Sql,我想比较两个表,得到一组查找值不匹配以及另一个表缺少键值的结果。第一部分适用于以下查询: SELECT * FROM ( SELECT mID, mLookup FROM m) t1 FULL OUTER JOIN ( SELECT aID, aLookup FROM a) t2 ON t1.mID = t2.aID WHERE t1.mID = t2.aID AND t1.mLookup <> t2.aLookup 但是,

我想比较两个表,得到一组查找值不匹配以及另一个表缺少键值的结果。第一部分适用于以下查询:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    t1.mID = t2.aID AND
    t1.mLookup <> t2.aLookup
但是,由于ON t1.mID=t2.aID,它不会从t1和t2返回行,因为在另一个表中没有相应的ID

如何在同一个查询中实现这两个目标?

删除WHERE子句的ID部分。t1.mID=t2.aID上的完整外部联接足以将表链接在一起。完全外部联接将返回联接中的两个表,即使其中一个表不匹配

但是,WHERE t1.m_ID=t2.aID子句将结果限制为两个表中存在的ID。这将有效地使完整的外部联接与内部联接类似

换言之:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    --t1.mID = t2.aID AND -- remove this line
    t1.mLookup <> t2.aLookup
-编辑-

重新阅读你的问题,你只想要不匹配的。在这种情况下,您需要搜索任意一方的ID为NULL的位置:

SELECT * FROM (
    SELECT  mID, mLookup
    FROM m) t1

FULL OUTER JOIN (
    SELECT  aID, aLookup
    FROM a) t2

ON t1.mID = t2.aID

WHERE
    t1.mID IS NULL OR
    t2.mID IS NULL OR
    t1.mLookup <> t2.aLookup
查询的where子句过滤掉那些没有匹配ID的行。试试这个:

SELECT m.mId, m.mLookup, a.aId, a.aLookup
 from m
  full outer join a
   on a.aId = m.mId
 where m.mId is null
  or a.aID is null
  or m.mLookup <> a.aLookup

完全外部联接获取所有可能的行,where子句保留其中一方或另一方为null的所有行,如果它们都不匹配null,则仅保留查找值不同的行。

从SQL Server 2008开始,并且对Azure SQL数据库、Azure SQL数据仓库、并行数据仓库也有效

下面是SQL查询;
您使用的是什么数据库系统?除了从左输入查询返回右输入查询未输出的不同行之外。
USE [test]
GO

CREATE TABLE [dbo].[Student1](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Student2](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

---- You can re-run from here with your data 
truncate table [Student1]
truncate table [Student2]

insert into [Student1] values (1, N'سید حیدر')
insert into [Student1] values (2, N'Syed Ali')
insert into [Student1] values (3, N'Misbah Arfin')

insert into [Student2] values (2, N'Syed Ali')
insert into [Student2] values (3, N'Misbah Arfin');

with StudentsAll (Id, [Name]) as
(
select s1.Id, s1.[Name] from Student1 s1
    left outer join Student2 s2 
on 
    s1.Id = s2.Id
),
StudentsMatched (Id, [Name]) as
(
select s1.Id, s1.[Name] from Student1 s1
    inner join Student2 s2 
on 
    s1.Id = s2.Id
)
select * from StudentsAll
except
select * from StudentsMatched