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