如何从 SQL Server 中的表中获取不匹配的数据
Posted
技术标签:
【中文标题】如何从 SQL Server 中的表中获取不匹配的数据【英文标题】:How to get unmatched data from tables in SQL Server 【发布时间】:2019-04-25 14:19:47 【问题描述】:我试图通过比较 MS SQL Server 中的两个表来从两个表中获取不匹配的数据并获取不匹配的数据
举个例子
表 1:
id | user | password | token |
1 | Andres | 121212 | e12A1 |
2 | Louie | 131312 | e12A2 |
3 | Marcus | 141312 | e22A2 |
4 | Mark | 141312 | e22A2 |
表 2:
id | user | password | token |
1 | Andres | 121212 | e12A1 |
2 | Louie | 131312 | e12A2 |
6 | Grace | 151312 | e13A2 |
7 | Sophia | 159312 | e14A2 |
预期输出:
id | user | password | token |
3 | Marcus | 141312 | e22A2 |
4 | Mark | 141312 | e22A2 |
6 | Grace | 151312 | e13A2 |
7 | Sophia | 159312 | e14A2 |
解决此问题的任何查询都会有所帮助
【问题讨论】:
你试过什么?这可以很容易地通过 UNION / NOT EXISTS 的组合来完成。 【参考方案1】:您可以使用EXCEPT
和UNION
来比较两个表:
SELECT * FROM
(
SELECT * FROM #Temp1
EXCEPT
SELECT * FROM #Temp2
) A
UNION
SELECT * FROM
(
SELECT * FROM #Temp2
EXCEPT
SELECT * FROM #Temp1
) B
或者你可以使用NOT EXISTS()
SELECT * FROM #Temp1 T1 WHERE NOT EXISTS (SELECT 1 FROM #Temp2 T2 WHERE T1.id=T2.id)
UNION
SELECT * FROM #Temp2 T2 WHERE NOT EXISTS (SELECT 1 FROM #Temp1 T1 WHERE T1.id=T2.id)
【讨论】:
【参考方案2】:您也可以使用 WINDOW FUNCTION 来满足您的要求。更多关于WINDOW FUNCTION的内容,可以参考。 https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017
create table [Table 1]
(id int ,
[user] varchar(10),
password varchar(10),
token varchar(10))
create table [Table 2]
(id int ,
[user] varchar(10),
password varchar(10),
token varchar(10))
insert into [Table 1] values
(1,'Andres','121212','e12A1'),
(2,'Louie','131312','e12A2'),
(3,'Marcus','141312','e22A2'),
(4,'Mark','141312','e22A2')
insert into [Table 2] values
(1,'Andres','121212','e12A1'),
(2,'Louie','131312','e12A2'),
(6,'Grace','151312','e13A2'),
(7,'Sophia','159312','e14A2')
;with cte1 as (
select * from [Table 1]
union all
select * from [Table 2]
)
,cte2 as (
select *,
count(*)over(partition by id,[user],password,token ) as ct
from cte1 )
select * from cte2 where ct=1
/*
id user password token ct
----------- ---------- ---------- ---------- -----------
3 Marcus 141312 e22A2 1
4 Mark 141312 e22A2 1
6 Grace 151312 e13A2 1
7 Sophia 159312 e14A2 1
*/
【讨论】:
以上是关于如何从 SQL Server 中的表中获取不匹配的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL Server 中特定数据库的表中获取所有列名?
如何从sql server中的表中查询json数组类型列的值?
如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?