【问题标题】:How to get unmatched data from tables in SQL Server如何从 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 的组合来完成。

标签: sql sql-server tsql sql-server-2008 sql-server-2005


【解决方案1】:

您可以使用EXCEPTUNION 来比较两个表:

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
    */
    

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2019-06-25
      • 2019-12-28
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多