比较两个不同但结构相同的数据库中的两个表未返回预期结果
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
我不确定如何解决这个问题。
我正在尝试从 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