确定仅存在于两个表中的一个表中或两个表中的值

时间:2012-11-04 14:09:23

标签: sql sql-server-2008

我想在SQL Server 2008数据库中找到两个表:

  • 两个表中都存在的值(两个表中都包含所有列)
  • 值存在于第一个表中,但不存在于第二个表中
  • 值存在于第二个表中,但不存在于第一个表中

代码:

CREATE TABLE #_temp
(ATM INT, Fault INT)

CREATE TABLE #_temp1
(ATM INT, Fault INT)

INSERT INTO #_temp  VALUES (10,101), (11,101), (12,101), (12,101), (10,105), (13,101)
INSERT INTO #_temp1 VALUES (10,102), (11,101), (12,103), (12,100), (10,105), (13,101)

/* My Try

SELECT * FROM #_temp t RIGHT JOIN #_temp1 t1 ON t.ATM=t1.ATM AND t.Fault=t.Fault AND t.ATM IS NULL AND t.Fault IS NULL

SELECT * FROM #_temp t JOIN #_temp1 t1 ON t.ATM=t1.ATM AND t.Fault=t.Fault

*/

DROP Table #_temp
DROP Table #_temp1 

4 个答案:

答案 0 :(得分:2)

要查找一个表而不是另一个表中存在的值,您应该使用where子句来确定空值:

Create Table #_temp
(ATM Int,Fault Int)

Create Table #_temp1
(ATM Int,Fault Int)

Insert Into #_temp Values(10,101),(11,101),(12,101),(12,101),(10,105),(13,101)
Insert Into #_temp1 Values(10,102),(11,101),(12,103),(12,100),(10,105),(13,101)


--Values Present in both Table

SELECT t.* 
FROM #temp t
    INNER JOIN #_temp1 t1
        ON t.[ATM Int] = t1.[ATM Int]
        AND t.[Fault Int] = t1.[Fault Int]

--Values Present in First Table But not in Second

SELECT t.* 
FROM #temp t
    LEFT JOIN #_temp1 t1
        ON t.[ATM Int] = t1.[ATM Int]
        AND t.[Fault Int] = t1.[Fault Int]
WHERE t1.[ATM Int] IS NULL

--Values Present in Second Table But not in First

SELECT t.* 
FROM #_temp1 t
    LEFT JOIN #temp t1
        ON t.[ATM Int] = t1.[ATM Int]
        AND t.[Fault Int] = t1.[Fault Int]
WHERE t1.[ATM Int] IS NULL

答案 1 :(得分:1)

Insert Into #_temp Values(10,101),(11,101),(12,101),(12,101),(10,105),(13,101)
Insert Into #_temp1 Values(10,102),(11,101),(12,103),(12,100),(10,105),(13,101)



Select t.* From #_temp t LEFT join #_temp1 t1 on t.ATM=t1.ATM and t.Fault is null
UNION
Select t.* From #_temp1 t  left join #_temp t1 on t.ATM=t1.ATM and t.Fault is NULL



Drop Table #_temp
Drop Table #_temp1 

答案 2 :(得分:0)

将列重命名为表格应该有效:

SELECT A.ATM AS ATM1, A.FAULT AS FAULT1, B.ATM AS ATM2, B.FAULT AS FAULT2
FROM #_temp as A, #_temp1 as B
ON A.ATM = BUT.ATM

SELECT * FROM #_temp

SELECT * FROM #_temp1

答案 3 :(得分:0)

确切地说你正在寻找什么,另一个

Create Table #_temp
(ATM Int,Fault Int)

Create Table #_temp1
(ATM Int,Fault Int)

Insert Into #_temp Values(10,101),(11,101),(12,101),(12,101),(10,105),(13,101)
Insert Into #_temp1 Values(10,102),(11,101),(12,103),(12,100),(10,105),(13,101)


Select a.*,t.ATM as tATM,t.Fault as tFault,t1.ATM as t1ATM,t1.Fault as t1Fault from
(
Select t.* From #_temp t 
UNION
Select t.* From #_temp1 t 
) a
LEFT join #_temp t on t.ATM=a.ATM and T.Fault = a.Fault
LEFT join #_temp1 t1 on t1.ATM=a.ATM and T1.Fault = a.Fault 


Drop Table #_temp
Drop Table #_temp1