Azure上的SQL Server 2016:
Database1.Table1包含300万条记录,由任意特定SourceId的多行组成(例如,SourceId 1的10条记录,SourceId 2的20条记录,SourceId 3的15条记录等)。
Database2.Table1是关于上述每个SourceId的信息表。它包含2k条记录,每条记录对应一个SourceId,以及有关该源的信息。
两个数据库都在同一个SQL Server实例上。
我需要构建的是一个查询,它将查看Database1.Table1的所有记录,并返回Database2.Table1中SourceId 不存在的所有记录。
我只在数据库中的表上做过JOIN,从不在两个不同的数据库上做过(虽然我相信这是一个类似的方法?)这是我通过研究得出的结果,这是不工作(查询在绝对应该返回时没有结果):
SELECT DataSourceID, OrderNo
FROM Database1.Table1
JOIN Database2.Table1.SourceID = Database1.Table1.DataSourceID
WHERE NOT EXISTS Database2.Table1.SourceID
任何帮助都将不胜感激。
编辑:为了简单起见,我最初保留了2个数据库中字段的名称相同,但实际上名称不同。 Database1的字段名称是DataSourceId,Database2的字段名称是SourceId。我看到我必须根据Sean_Lange发布的答案更新此内容。编辑#2:如上所述,此SQL Server位于Azure上。在生产环境中测试以下答案时,我收到一个错误,即此版本的SQL Server不支持在Database1中引用数据库和/或服务器名称。"我之前见过这个。 Azure SQL Server不允许您在查询中指定数据库名称。我不知道我应该如何解决这个问题然后进行跨数据库查询,但我现在将研究Stack Overflow问题,以便在继续原始问题之前克服第一个障碍。
编辑#3:感谢Sean Lange在Azure上发布跨数据库查询的链接。现在检查,然后将返回到原始问题。
答案 0 :(得分:2)
您可以使用NOT EXISTS,但更简单的方法是使用EXCEPT。 https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017
SELECT SourceID, OrderNo
FROM Database1.Table1
EXCEPT
SELECT SourceID, OrderNo
FROM Database2.Table1
答案 1 :(得分:1)
SELECT SourceID, OrderNo
FROM Database1.Table1 AS T1
WHERE NOT EXISTS ( SELECT 1/0 FROM Database2.Table1 AS T2
WHERE T1.SourceID = T2.SourceID )