比较两个不同但结构相同的数据库中的两个表未返回预期结果

Comparing two tables in two different, but structurally identical databases is not returning expected results

我不确定如何解决这个问题。

我正在尝试从 2020 年数据库中查找所有不在 2019 年数据库中的教授。

两个数据库在结构上完全相同,只是部分数据不同。

如果我运行这个查询:

SELECT  * FROM year_2020.dbo.classList 
WHERE professorID NOT IN(SELECT professorID FROM year_2019.dbo.classList)

我得到 0 个结果

我知道这是不对的。

因为我可以拿一个 professorID 是 2020:

SELECT * FROM year_2020.dbo.classList WHERE classID = 'bb101' 

我看到 'rts103' 的教授 ID 是这样的:

classID    dateStart     DeptId     professorID
bb101      2/1/2020      soc3       rts103

那么我可以在 2019 年做同样的事情:

SELECT * FROM year_2019.dbo.classList WHERE classID = 'bb101' 

而且我看到他不在这个数据库中:

classID    dateStart     DeptId     professorID
bb101      2/1/2019      soc3       NULL

所以我不确定发生了什么。

是否有更好的方法来制定此查询?

谢谢!

我会推荐 not exists。此外,您的问题使您看起来想要关联 professorID classID 上的行,因此:

SELECT c20.* 
FROM year_2020.dbo.classList c20
WHERE NOT EXISTS (
    SELECT 1 
    FROM year_2019.dbo.classList c19
    WHERE c19.professorID = c20.professorID AND c19.classID = c20.classID
)

由于 ProfessorID 有一些 NULL 值,NOT IN 将不起作用。

NOT IN 的计算如下:

WHERE SomeValue NOT IN (3,NULL)

转换为

WHERE SomeValue != 3 AND SomeValue != NULL

Read more about NOT IN Vs NOT EXISTS

建议使用 NOT EXISTS 子句,如 @GMB

所建议

还有另一种方法,因为它们是相同的表。您可以使用 EXCEPT 子句。

;WITH CTE_2020NewProfessors AS
(
SELECT  ProfessorID FROM year_2020.dbo.classList 
EXCEPT
SELECT professorID FROM year_2019.dbo.classList
)
SELECT * FROM year_2020.dbo.classList 
WHERE ProfessorID in (SELECT professorID from CTE_2020NewProfessors)

您还可以比较所有行 - 就像这样 - 即使它很昂贵......

WITH
classlist2020(classid,datestart,deptid,professorid) AS (
          SELECT 'bb101','2020-02-01','soc3','rts103'
)
,
classlist2019(classid,datestart,deptid,professorid) AS (
          SELECT 'bb101','2020-02-01','soc3',NULL
)
SELECT * FROM classlist2020
EXCEPT
SELECT * FROM classlist2019
-- out  classid | datestart  | deptid | professorid 
-- out ---------+------------+--------+-------------
-- out  bb101   | 2020-02-01 | soc3   | rts103