【发布时间】:2017-08-09 22:53:38
【问题描述】:
所以我试图将我的头绕在光标周围。我的任务是将数据从一个数据库传输到另一个数据库,但它们的架构略有不同。假设我有 TableOne(Id、Name、Gold)和 TableTwo(Id、Name、Lvl)。我想从 TableTwo 中取出所有记录并将其插入 TableOne,但它可以是 Name 列上的重复数据。因此,如果 TableOne 中存在来自 TableTwo 的单个记录(在名称列比较中),我想跳过它,如果不存在 - 在 TableOne 中创建具有唯一 ID 的记录。
我正在考虑对 TableTwo 中的每条记录进行循环,并为每条记录检查它是否存在于 TableOne 中。那么,如何在不每次都调用另一个数据库的情况下进行此检查?我想首先从 TableOne 中选择所有记录,将其保存到变量中,然后在循环本身中检查这个变量。这在 SQL 中甚至可能吗?我对SQL不太熟悉,一些代码示例会很有帮助。
如果这很重要,我正在使用 Microsoft SQL Server Management Studio。当然,TableOne 和 TableTwo 存在于不同的数据库中。
【问题讨论】:
-
我认为您的意思是“光标”。话虽如此,大多数操作通常不需要游标。绝对不适合这个操作。您只需要编写一个删除重复项的选择语句,然后将这些结果插入到目标表中。在一个 SQL 语句中,没有循环。此数据库是否在同一个 SQL Server 上?
-
是的,但它并不是那么简单,因为我会丢失数据以及删除的记录。我展示了非常简化的表格,实际上它们看起来像 T1(Id,Name,Color,Level,Money,Customer,AnotherRealtedData)T2(Id,Name,Color,DataForTable3,DataForTable4)。我要执行的操作将针对几个表完成。
-
根据您的解释,这很简单。您需要弄清楚比较字段是什么,然后使用
select * from sourcedb..sourcetable where not exists (select * from targetdb..targettable where targettable.joinkey = sourcetable.joinkey)。然后它只会根据您的加入键选择不存在的记录
标签: sql sql-server tsql